首页 > 代码库 > 鸟哥私房菜第七章 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文件与目录管理