首页 > 代码库 > 鸟哥私房菜第七章 Linux文件与目录管理
鸟哥私房菜第七章 Linux文件与目录管理
一、目录与路径
1、相对路径与绝对路径
2、目录的相关操作
以下为特殊目录:
. :代表此目录
.. :代表上一层目录
- :代表前一个工作目录
~ :代表“目前用户身份”所在的主文件夹
~account :代表account这个用户的主文件夹
注:根目录下上一层(..)与前(.)是同一个目录。
(1)cd:切换目录(change directory)
语法:
[root@www ~]# cd [相对路径或绝对路径]
例:
[root@www ~]# cd ~
(2)pwd:显示当前目录(print working directory)
语法:
[root@www ~]# pwd [-p]
参数-p:显示出当前路径,而非使用连接路径。
例:
[root@www ~]# pwd
(3)mkdir:新建一个新的目录(make directory)
语法:
[root@www ~]# mkdir [-mp] 目录名称
-m:配置文件案的权限,直接设置,不需要看默认权限;
-p:直接将所需要的目录递归创建。
例:
[root@www tmp]# mkdir test
[root@www tmp]# mkdir -p test1/test2/test3
[root@www tmp]# mkdir -m 711 test2
(4)rmdir:删除一个空的目录(remove directory)
语法:
[root@www ~]# rmdir [-p] 目录名称
-p:连同上层“空的”目录也一起删除
例:
[root@www tmp]# rmvdir test
[root@www tmp]# rmvdir -p test1/test2
注:被删除的目录里面必定不能存在其他的目录或文件,如果要将所有目录下的东西都删除掉,就必须使用“rm -r test”了。
3、执行文件路径变量:$PATH
正是因为环境变量PATH的帮助,所以在任何地方都能执行ls(/bin/ls)这个命令,当我们在执行一个命令的时候,系统会按照PATH的设置去每个PATH定义的目录下查询文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查询到的同名命令先被执行。
[root@www ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
PATH这个变量的内容由一堆目录所组成,每个目录中间用冒号隔开。
例:
[root@www ~]# mv /bin/ls /root #移动后无法直接输入ls正常使用
[root@www ~]# /root/ls #可以使用绝对路径执行
[root@www ~]# ./ls #或使用相对路径执行
[root@www ~]# PATH="$PATH":/root #也可将/root加入PATH
[root@www ~]# mv /root/ls /bin #将ls放回原位后需重新登入即可正常使用
以下几点需注意:
不同身份用户默认的PATH不同,默认能够随意执行的命令也不同;
PATH是可以修改的,所以一般用户还是可以通过修改PATH来执行某些位于/sbin或/usr/sbin下的命令来查询;
使用绝对路径或相对路径直接指定某个命令的文件名来执行,会比查询PATH来的正确;
命令应该要放置到正确的目录下,执行才会方便;
本目录(.)最好不要放到PATH中。
二、文件与目录管理
1、查看文件与目录:ls
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--colour={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称
参数:
-a:全部的文件,连同隐藏文件一起列出来;
-A:列出全部的文件(连同隐藏文件,但不包括.与..这两个目录)
-d:仅列出目录本身,而不是列出目录内的文件数据;
-f:直接列出结果,而不进行排序(默认以文件名进行排序);
-F:根据文件、目录等信息给予附加数据结构,例如:
*:代表可执行文件;/:代表目录;=:代表socket文件;|:代表FIFO文件
-h:将文件容量以较易读的方式列出来(如KB,GB等)
-i:列出inode号码
-l:列出长数据串,包含文件的属性与权限等数据
-n:列出UID与GID,而非用户与用户组的名称
-r:将排序结果反向输出
-R:连同子目录一起列出来
-S:以文件容量排序
-t:以文件时间排序
--color=never:不依据文件特性给予时间显示
--color=always:显示颜色
--color=auto:让系统自行依据设置来判断是否给予颜色
--full-time:以完整时间模式输出(包含年月日时分)
--time={atime,ctime}:输出访问时间或改变权限属性时间(ctime)而非更改内容时间mtime)
2、复制、删除与移动:cp,rm,mv
(1)复制文件或目录copy
[root@www ~]# cp [-adfilprsu] 源文件(source) 目标文件(destination)
[root@www ~]# cp [options] source1 source2 source3 ... directory
-a:相当于-pdr的意思。
-d:若文件为连接文件的属性,则复制连接文件属性而非文件本身
-f:强制(force)的意思,若目标文件已存在且无法开启,则删除后再尝试一次
-i:若目标文件已经存在,在覆盖时会先询问操作的进行;
-l:进行硬链接文件的创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性;
-r:递归持续复制,用于目录的复制行为;
-s:复制称为符号链接文件(symbolic link),即“快捷方式”;
-u:若dstination比source旧才更新destination。
例:
[root@www tmp]# cp -a /var/log/wtmp wtmp2
复制时需注意以下几点:
a.是否需完整保留来源文件的信息
b.源文件是否为软连接文件
c.源文件是否为特殊文件
d.源文件是否为目录
(2)rm(移除文件或目录)
语法:
[root@www ~]# rm [-fir] 文件或目录
-f:force,忽略不存在的文件,不会出现警告信息
-i:互动模式,再删除前会询问用户是否操作
-r:递归删除,最常用在目录的删除
例:
[root@www tmp]# rm -i bashrc*
[root@www tmp]# rm -r /tmp/etc
[root@www tmp]# \rm -r /tmp/etc
#在指令前加上反斜线,可以忽略掉alias的指定选项,不再询问是否要删除。
(3)mv(移动文件与目录,或更名)
[root@www ~]# mv [fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 ....directory
-f:force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i:若目标文件(destination)已经存在时,就会询问是否覆盖
-u:若目标文件已经存在,且source比较新,才会更新
例:
[root@www ~]# mv bashrc mvtest #将某个档案移动到某个目录
[root@www ~]# mv mvtest mvtest2 #更改文件名,等同于rename
3、取得路径的文件名与目录名称
取得最后的文件名:
[root@www ~]# basename /etc/sysconfig/network
net work
[root@www ~]# dirname /etc/sysconfig/network
/etc/sysconfig/network
4、文件内容查阅
1、直接查看文件内容
(1)cat(concatenate)
[root@www ~]# cat [-AbEnTv]
-A:相当于-vET的整合,可列出一些特殊字符,而不是空白
-b:列出行号,仅针对非空白行做行号显示,空白行不标行号
-E:将结尾断行字符$显示出来
-n:打印出行号,连空白行也标出行号。
-T:将[Tab]键以^i显示出来
-v:列出一些看不出来的特殊字符
例:
[root@www ~]# cat -n /etc/issue
(2)反向列示
[root@www ~]# tac /etc/issue
(3)nl(添加行号打印)
[root@www ~]# nl [-bnw] 文件
-b:指定行号指定的方式,主要有两种
-b a:表示不论是否为空行,也同样列出行号
-b t:如果有空行,空的那一行不要列出行号(默认值)
-n:列出行号表示的方法,主要有三种
-n ln:行号在屏幕的最左方显示;
-n rn:行号在屏幕的最右方显示,且不加0;
-n rz:行号在自己字段的最右方显示,且加0;
-w:行号字段占用的位数
例:[root@www~]# nl -b a -n rz -w 3 /etc/issue
001 centos release 5.3 (final)
002 kernel /r on an /m
003
2、翻页查看
(1)more
例:
[root@www ~]# more /etc/man.config
有用的按键:
空格键:翻下一页
ENTER:向下滚动一行
/字符串:代表在则个显示的内容当中,向下查询“字符串”这个关键字
:f:立刻显示出文件名以及目前显示的行数
q:代表立刻离开more
b或[ctrl+b]:代表往回翻页,只对文件有用,对管道无用
(2)less
例:
[root@www ~]# less /etc/man.config
有用按键:
空格键:向下翻动一页
[pagedown]:向下翻动一页
[pageup]:向上翻动一页
/字符串:向下查询“字符串”的功能
?字符串:向上查询“字符串”的功能
n:重复前一个查询(与/或?有关)
N:反向重复前一个查询(与/或?有关)
q:离开
3、数据选取
(1)head
[root@www ~]# head [-n number] 文件
-n:后面接数字,代表显示几行,如果为负数(-100)时代表列出前面所有的行数,但不包括后面的一百行。
[root@www ~]# head -n -100 /etc/man.config
(2)tail
[root@www ~]# tail [-n number] 文件
-n:后面接数字,代表显示几行的意思
-f:表示持续检测后面所接的文件名,要等到按下[ctrl]-c才会结束tail的检测
例:[root@www ~]# tail /etc/man.config
[root@www ~]# tail -n +100 /etc/man.config
[root@www ~]# tail -f /var/log/messages
4、查看非纯文本文件:od
[root@www ~]# od [-t TYPE] 文件
-t:后面可以接各种类型的输出,如
a:利用默认的字符来输出
c:利用ASCII字符输出
d[size]:利用十进制decimal来输出数据,每个整数占用size byte
f[size]:利用浮点数floating来输出数据,每个数占用size byte
o[size]:利用八进制octal来输出数据,每个整数占用size byte
x[size]:利用十六进制hexadecimal来输出数据,每个整数占用size byte
例:
[root@www ~]# od -t c /usr/bin/passwd
[root@www ~]# od -t oCc /etc/issue
[root@www ~]# echo password | od -t oCc #查看password单词的ASCII对照
5、修改文件时间或创建新文件
文件时间类型:
modification time (mtime):内容数据修改时间;
status time (ctime):文件状态时间,即文件权限、属性更改时间
access time (atime):文件内容读取时间
修改时间语法:
[root@www ~]# touch [-acdmt] 文件
-a:仅修改访问时间
-c:仅修改文件的时间,若文件不存在则不创建新文件夹
-d:后面可以接欲修改的日期而不用目前的日期,也可以使用--date="日期或时间"
-m:仅修改mtime
-t:后面可以接欲修改的日期,而不用目前的时间,格式为[YYMMDDhhmm]
例:
[root@www ~]# cp -a ~/.bashrc bashrc
[root@www ~]# ll bashrc; ll --time=atime bashrc;ll --time=ctime bashrc
[root@www ~]# touch -d "2 days ago" bashrc
[root@www ~]# touch -t 07120202 bashrc
touch常用的情况为:
(1)创建一个空的文件
(2)将某个文件日期修改为目前日期
在默认情况下如果touch后面有接文件,则该文件的三个时间都会更新为目前的时间,若该文件不存在,则会主动创建一个新的空文件。
四、文件与目录的目录的默认权限与隐藏权限
1、文件默认权限:umask
umask是指目前用户在新建文件或目录时候的权限默认值
(1)查看默认权限
[root@www ~]# umask
0022 <==第一位为特殊权限数字,一般权限为后三位数字
[root@www ~]# umask -S
u=rwx,g=rx,o=rx
在默认权限的属性上,目录与文件时不一样的,所以默认情况如下:
若用户创建“文件”则默认没有可执行(X)的权限,即只有r、w这两个选项,也就是最大为666,默认权限为-rw-rw-rw
若用户新建“目录”,因x与是否可以进入此目录有关,所以默认为所有权限均开放,即为777,默认权限为drwxrwxrwx
要注意的是,umask值得是“该默认值需要减掉的权限”,如果拿掉能读写的权限,也就是6。如果umask为022,那么user并没有被拿掉任何权限,不过group与others的权限被拿掉了2,也就是w这个权限。
那么新建文件时:(-rw-rw-rw-)-(-----w--w-)== -rw-r--r--
新建目录时:(drwxrwxrwx)-(d----w--w-)== drwxr-xr-x
(2)修改默认权限
例:
[root@www ~]# umask 002
[root@www ~]# touch test3
[root@www ~]# mkdir test4
在默认情况中,root的umask会拿掉比较多的属性,root的umask默认是022,这是基于安全的考虑,至于一般身份用户,通常他们的umask为002,即保留同用户组写入的权力。
2、文件隐藏属性chattr、lsattr
chattr只能在Ext2/Ext3的文件系统上生效
(1)chattr
[root@www ~]# chattr [+-=] [ASacdistu]
参数:
+:增加某一个特殊参数,其他原本存在的参数则不动
-:删除某一个特殊参数,其他原本存在参数则不动
=:仅有后面接的参数
A:当设置了A这个属性时,若你有访问此文件(或目录)时它的访问时间atime将不会被修改,可避免I/O较慢的机器过度访问磁盘(目前建议使用档案系统挂载参数处理这些项目)
S:一般文件是异步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该改动会“同步”写入磁盘
a:当设置a之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root才能设置这个数据
c:当这个属性设置之后,将会自动将此文件压缩,在读取的时候将会自动解压缩,但在存储的时候,将会先进行压缩后再存储,对大文件比较有用
d:当dump程序被执行的时候,设置d属性将可使该文件(或目录)不会被dump备份
i:可以让一个文件“不能被删除、改名,设置连接也无法写入或添加数据”,对系统安全性有很大的帮助,只有root才能设置此属性
s:当文件设置了s属性时,如果这个文件被删除,他将会被完全从这个硬盘空间中删除
u:与s相反,当使用u来配置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,可以使用来找回该文件
例:
[root@www ~]# cd /tmp
[root@www tmp]# touch attrtest
[root@www tmp]# chattr +i attrtest
[root@www tmp]# rm attrtest
[root@www tmp]# chattr -i attrtest
(2)显示文件隐藏属性
[root@www ~]# ls attr [-adR] 文件或目录
参数:
-a:将隐藏文件的属性也显示出来
-d:如果接的是目录,仅列出目录本身的属性而非目录内的文件名
-R:连同子目录的数据也一并列出来
例:
[root@www tmp]# chattr +aij attrtest
[root@www tmp]# lsattr attrtest
----ia---j--- attrtest
3、文件特殊权限:SUID,SGID,SBIT
[root@www ~]# ls -ld /tmp; ls -l /usr/bin/passwd
drwxrwxrwt 7 root root 4096 sep 27 18:23 /tmp
-rwsr-xr-x 1 root root 22984 Jan 7 2007 /usr/bin/passwd
(1)Set UID
当S这个标志出现在文件所有者的x权限上时就被称为Set UID,简称为SUID的特殊权限,SUID的限制于功能为:
a.SUID仅对二进制程序(binary program)有效;
b.执行者对于该程序需要具有x的可执行权限;
c.本权限仅在执行该程序过程中(run-time)有效;
d.执行者将具有该程序所有者(owner)的权限。
如:vbird对于/usr/bin/passwd这个程序是具有x权限的,表示vbird能执行passwd,但passwd的拥有者是root这个账号,vbird执行passwd的过程中,会“暂时”获得root权限,/etc/shadow可以被vbird所执行的passwd所修改,而/bin/cat并无此权限,故无法执行。
(2)Set GID
当s在用户组的x权限上时就被称为Set GID,简称为SGID
例:
[root@www ~]# ls -l /usr/bin/locate
-rwx--s--x root slocate 23856 mar 15 2007 /usr/bin/locate
与SUID不同的是,SGID可以针对文件或目录来设置,如果是对文件来说,SGID有如下功能:
a.SGID对二进制程序有用;
b.程序执行者对于该程序来说,需具备x的权限;
c.执行者在执行的过程中将会获得该程序用户组的支持。
如:
[root@www ~]# ll /usr/bin/locate /var/lib/mlocate/mlocate.db
-rwx--s--x l root slocate 23856 Mar 15 2007 /usr/bin/locate
-rw-r----- l root slocate 3175776 sep 23 24:02 /var/lib/mlocate/mlocate.db
与SUID非常类似,若使用vibird这个账号去执行locate时,那vibird会获得slocate用户组的支持,因此能读取到mlocate.db
SGID也可以用在目录上,有以下功能:
a.用户若对于此目录具有r与x的权限时,该用户能进入此目录
b.用户在此目录下的有效用户组(effective group)将会变成该目录的用户组
c.若用户在此目录下具有w的权限,则用户所创建的新文件的用户组与此目录的用户组相同。
(3)Sticky BiT
目前只对目录有效,对于文件已经没有效果了,对目录的作用是:
当用户对于此目录具有w,x权限,即具有写入权限时,用户在该目录下创建文件或目录时,仅有自己与root才有权利删除、重命名、移动该文件。
如/tmp本身权限为“drwxrwxrwt”,任何人都能在/tmp内添加、修改文件,但仅有文件、目录创建者与root能够删除、重命名、移动自己的目录或文件。
(4)SUID/SGID/SBIT权限设置
数字形态更改权限的方式为“三个数字”的组合,那么如果在这三个数字之间再加上一个数字的话,最前面的那个数字就代表这几个权限了。
4:代表SUID
2:代表SGID
1:代表SBIT
例:
[root@www tmp]# touch test
[root@www tmp]# chmod 4755 test; ls -l test
-rwsr-xr-x 1 root root 0 sep 29 03:06 test
[root@www tmp]# chmod 6755 test; ls -l test
-rwsr-sr-x 1 root root 0 sep 29 03:06 test
[root@www tmp]# chmod 1755 test; ls -l test
-rwxr-xr-t 1 root root 0 sep 29 03:06 test
[root@www tmp]# chmod 7666 test; ls -l test
-rwSrwSrwT 1 root 7666 test; ls -l test
注:在最后一个例子中S/T均为大写,因为user,group,others都没有x这个可执行的标识,所以S/T代表的就是“空的”。
也可以通过符号法来处理,其中SUID为u+s,SGID为g+s,SBIT则是o+t
例:
[root@www tmp]# chmod u=rwxs,go=x test;ls -l test
-rws--x--x 1 root root 0 Aug 18 23:47 test
[root@www tmp]# chmod g+s,o+t test;ls -l test
-rws--s--t 1 root root 0 Aug 18 23:47 test
4、查看文件类型
如果想知道某个文件的基本数据,例如是属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态函数库(share library)等等信息,可以利用file这个命令来查看。
例:
[root@www ~]# file ~/.bashrc
5、命令与文件的查询
(1)脚本文件名的查询(which)
[root@www ~]# which [-a] command
-a:将所有由PATH目录中可以找到的命令均列出,而不只第一个被找到的命令名称
例:
[root@www ~]# which ifconfig
/sbin/ifconfig
[root@www ~]# su - vbird
[root@www ~]$ which ifconfig
/usr/bin/which:no ifconfig in (/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:
/home/vbird/bin)
注:which是根据用户设置的PATH变量内的目录去查找可执行文件的,所以不同的PATH设置内容所找到的命令不一样,因为/sbin不在vbird的PATH中,所以找不到
5、文件名查找
(1)whereis(寻找特定文件)
[root@www ~]# whereis [-bmsu] 文件名或目录名
-b:只找二进制格式文件
-m:只找在说明文件manual路径下的文件
-s:只找source源文件
-u:查找不在上述三个选项当中的其他特殊格式文件
例:
[root@www ~]# whereis ifconfig
注:因为LINUX系统会将系统内所有文件都记录在一个数据库文件中而当使用whereis或者是locate时,都会以数据库文件的内容为准,因此查找速度会比find快很多,而且有时还会发现使用这两个执行文件时,会找到已经被删掉的文件,找不到最新的刚创建文件。
(2)locate
[root@www ~]# locate [-ir] keyword
-i:忽略大小写的差异
-c:不输出档名,仅计算找到的档案数量
-l:仅输出几行的意思,如输出5行则是-l 5
-S:输出locate所使用的资料档案的相关资讯,包括该资料库记录的档案/目录数量等
-r:后面可接正则表达式的显示方法
例:
[root@www ~]# locate -l 5 passwd
注:locate在其后输入文件的部分名称后,就会显示出包含此部分名称的文件名及路径,但locate寻找的数据是由已创建的数据库/var/lib/mlocate/里面的数据所查到的,优点是可以快速查到,缺点是因为根据distribution不同或一天更新一次,新创建文件无法查找到,需手动更新数据库,可使用updatedb命令。
updatedb根据/etc/updatedb.conf的设置去查找系统硬盘内的文件名,并更新/var/lib/mlocate内的数据文件。
(3)find
[root@www ~]# find [PATH] [option] [action]
a.时间参数-atime、-ctime、-mtime(以mtime为例):
-mtime n:n为数字,意义为n天之前的“一天内”被更改过的文件;
-mtime +n:列出在n天之前(不含n天本身)被更改过的文件名;
-mtime -n:列出在n天之内(含n天本身)被更改过的文件名;
-newer file:file为一个存在的文件,列出比file还要新的文件。
例:
[root@www ~]# find / -mtime 0
[root@www ~]# find /etc -newer /etc/passwd
注:0代表目前的时间,所以从现在开始到24小时前,有改动过内容的文件都会被列出来。
b.用户或用户组名有关的参数
-uid n:n为数字,这个数字是用户的账号ID,即UID
-gid n:n为数字,这个数字时用户组名的ID,即GID
-user name:name为用户账号名称
-group name:name为用户组名
-nouser:寻找文件所有者不存在/etc/passwd不存在的人
-nogroup:寻找文件用户组不存在于/etc/group中的文件
[root@www ~]# find /home -user vbird
[root@www ~]# find / -nouser #查找不属于任何人的档案
c.与文件权限及名称有关的参数
-name filename:查找文件名为filename的文件
-size [+-] SIZE:查找比SIZE还要大(+)或小(-)的文件,这个SIZE规格有:
c:代表byte,k:代表1024bytes
-type TYPE:查找文件的类型为TYPE的,类型主要有:一般正规文件(f)、设备文件(b、c)、目录(d)、连接文件(l)、socket(s)、及FIFO(p)等属性
-perm mode:查找文件权限“刚好等于”mode的文件
-perm -mode:查找文件权限“必须要包括mode的权限”的文件
-perm +mode:查找文件权限“包含任一mode的权限”的文件
例:
[root@www ~]# find / -name passwd
[root@www ~]# find / -name "*passwd*"
[root@www ~]# find /var -type s
[root@www ~]# find / -perm +7000
[root@www ~]# find /bin /sbin -perm +6000
d.其他可执行的操作
-exec command:command为其他命令,-exec后面可再接其他的命令来处理查找到的结果
-print :将结果打印到屏幕,这个操作是默认操作
例:
[root@www ~]# find / -perm +7000 -exec ls -l {} /;
[root@www ~]# find / -size +1000K
注:{}代表“由find找到的内容”,find的结果会被放置到{}位置中
-exec一直到“/;”代表find额外命令的开始(-exec)到结束(/;),在这中间的就是find命令的额外命令
因为“;”在bash环境下是有特殊意义的,所以用反斜杠来转义
例:
[root@www ~]# find /etc -size +50k -a -size -60k -exec ls -l {} \;
[root@www ~]# find /etc -size +50k -a ! -user root -type f -exec ls -l {} \;
[root@www ~]# find /etc -size +1500k -o -size 0
鸟哥私房菜第七章 Linux文件与目录管理