Linux 文件和目录管理常用命令(1)

文件和目录管理涉及的命令比较多,在现存的各个版本的Linux系统中,各命令功能大体相同。

6.11.1  文件和目录操作常用通配符

在Linux文件系统中,可以使用通配符来匹配多个选择。常用的通配符及其说明如表6.14所示。

表6.14  常用通配符及其说明

  

    

*

用来代表文件中任意长度的任意字符

?

用来代表文件中的任一个字符

[…]

匹配任意一个在中括号中的字符,

中括号里可以是一个用破折号

格式表示的字母或数字范围

前导字符串{…}

继字符串

大括号中的字符串逐一匹

配前导字符串和后继字符串


例如当前目录下存在cars 、cat、can、cannon、truck、bus和bike等几个文件,要列出所有以字母"c"开头的文件,可使用命令:

  1. #touch  car  cats  can  cannon  truck  bus  bike  
  2. #ls  c*  
  3. cars can cannon 

列出所有以字母"b"开头的文件名,命令行为:

  1. #ls  b*  
  2. bike bus 

列出所有第一个字母为"c",最后一个字母为"n"的文件,命令行为:

  1. #ls  c*n  
  2. can cannon 

列出包含字母"a"的所有文件,命令行为:

  1. #ls  *a*  
  2. cars cat can cannon 

列出当前目录下的所有文件,命令行为:

  1. #ls  *  
  2. bike bus cars cat can cannon truck 

通配符"?"只能匹配任意一个字符。例如列出上例中所有第三个字母是"n"的文件,命令行为:

  1. #ls  ??n*  
  2. can cannon 

列出第一个字母是"b",第三个字母是"s"的所有文件,命令行为:

  1. #ls  b?s*  
  2. bus 

中括号表示一个匹配的字符集,例如[123456]与[1-6]都表示数字1、2、3、4、5和6。大写字母A到D之间的任意一个字符可用[A-D]表示。多个集合之间可以用逗号分隔,例如[1-10,a-z,A-Z]表示数字1到10,小写字母a到小写字母z及大写字母A到大写字母Z。一个集合中若有前缀"!",则表示除了集合中包含的字符以外的所有字符组成的集合。如表示所有的辅音组成的字符集可写成[!aeiou]。例如要显示上例中所有以字母b 或c开头的文件名,命令行为:

  1. #ls  [b,c]*  
  2. bike bus car cat can cannon 

又如列出所有以字母b或c开头,以字母s或k 结尾的文件,命令行为:

  1. #ls  [b,c]*[s,k]  
  2. bus cars 

大括号是用来查找文件的一个常用方法,例如以长格式列出cars、cans和cats文件的信息,可以使用命令:

  1. #ls  -l  c{ar,an,at}s 

 

6.11.2  ls或dir命令:列出当前目录的内容

ls(list的缩写)命令可以列出当前目录的内容。dir命令是ls命令的一个别名,也是directory的缩写。通常列出的文件会以不同的颜色进行显示,不同的颜色代表不同的文件类型,表6.15列出了文件类型与颜色的对应关系。

表6.15  文件类型与颜色的对应关系

文件类型

    

目录

深蓝色

一般文件

浅灰色

执行文件

绿色

图形文件

紫色

链接文件

浅蓝色

压缩文件

红色

FIFO文件(命名管道)

棕色

设备文件

黄色


ls还会对特定类型的文件用符号进行标识,表6.16列出了常用的标识符号及其说明。

表6.16  特定文件类型标识符及其说明

    

    

.

表示隐藏文件

表示一个目录名

表示一个可执行文件

@

表示一个符号链接文件

|  

表示管道文件

=

表示socket文件


ls命令的格式如下:

  1. ls [选项]  目录或文件名 

其中各选项意义如下。

-a:列出指定目录下所有文件和子目录的信息(包括隐含文件)。

-A:同-a,但不列出. 和..。

-b:当文件名中有不可显示的字符时,将显示该字符的八进制数字。

-c:按文件的最后修改时间排序。

-C:分成多列显示。

-d:显示目录名而不是显示目录下的内容,一般与-l连用。

-f:在列出的文件名后加上符号来区别不同类型。

-R:递归地显示指定目录的各级子目录中的文件。

-s:给出每个目录项所用的块数,包括间接块。

-t:按最后修改时间排序(新的在前,旧的在后)。

-l:以长格式显示文件的详细信息,包括文件的类型与权限、链接数、文件所有者、文件所有者所属的组、文件大小、最近修改时间及文件名,详情见图6.4。

下面以不同的格式显示目录的内容:

  1. # ls            //以缩略格式显示目录内容  
  2. cal_txt      finger_txt   id_txt    newgrp_txt   
    suple_txt   who.txt  
  3. finger2_txt  groups_txt   last_txt  suple3_txt  
    suple_txt~  w.txt  
  4. finger3_txt  groups_txt2  ln        suple3_txt~  w  
  5. # ls  -l        //以长格式显示目录内容,包括权限、
    用户名、修改时间等  
  6. 总计 224  
  7. -rw-r--r-- 1 root root  2163 07-24 13:00 cal_txt           
  8. -rw-r--r-- 1 root root   212 07-23 06:37 finger2_txt  
  9. -rw-r--r-- 1 root root     0 07-23 06:39 finger3_txt  
  10. -rw-r--r-- 1 root root   248 07-23 06:31 finger_txt  
  11. -rw-r--r-- 1 root root    35 07-23 04:22 groups_txt  
  12. -rw-r--r-- 1 root bin    140 07-23 04:32 groups_txt2  
  13. -rw-r--r-- 1 root root   144 07-23 04:11 id_txt  
  14. -rw-r--r-- 1 root root  1655 07-22 19:19 last_txt  
  15. drwxr-xr-x 5 root root  4096 07-26 09:42 ln  
  16. -rw-r--r-- 1 root bin    143 07-23 04:24 newgrp_txt  
  17. -rw-r--r-- 1 root root 25098 07-26 19:15 suple3_txt  
  18. -rw-r--r-- 1 root root 24031 07-26 16:00 suple3_txt~  
  19. -rw-r--r-- 1 root root 25198 07-24 20:16 suple_txt  
  20. -rw-r--r-- 1 root root 24827 07-24 20:06 suple_txt~  
  21. -rw-r--r-- 2 root root   196 07-23 06:48 w  
  22. -rw-r--r-- 1 root root    46 07-23 06:48 who.txt  
  23. -rw-r--r-- 2 root root   196 07-23 06:48 w.txt  
  24. # ls -s         //显示所用的块数  
  25. 总计 224  
  26.  8 cal_txt       8 groups_txt    8 ln           
    32 suple_txt    8 w.txt  
  27.  8 finger2_txt   8 groups_txt2   8 newgrp_txt  
    32 suple_txt~  
  28.  4 finger3_txt   8 id_txt       32 suple3_txt    8 w  
  29.  8 finger_txt    8 last_txt     28 suple3_txt~   8 who.txt 

选项可以组合使用。例如,如果需要列出当前目录的所有内容(包括那些以"."开头的隐含文件),并以"冗余格式"在屏幕上输出文件的详细信息,可以使用选项"-al"。以冗余格式显示/root目录下的所有文件,可以使用命令:

  1. # ls  -al  /root  
  2. drwxr-x--- 18 root root  4096 07-26 16:00 .   
    //当前目录  
  3. drwxr-xr-x 24 root root  4096 07-25 05:43 ..   
    //父目录  
  4. -rw-------  1 root root   997 07-15 20:58 
    anaconda-ks.cfg       //普通文件  
  5. -rw-------  1 root root  2827 07-24 21:32 
    .bash_history         //隐藏文件  
  6. -rw-r--r--  1 root root    24 2006-07-13 
    .bash_logout           //隐藏文件  
  7. …  … 

其中文件名为"."表示当前目录,对应行列出了当前目录的详细信息。文件名为".."表示当前目录的上一级目录,即父目录,对应行列出了父目录的详细信息。文件名前有"."符号的文件是隐藏文件,只有使用了"-a"参数才会显示出来。

6.11.3  cd命令:更改当前目录

cd(Chage Directory)命令用于更改当前目录,表6.17列出了常用的cd命令与运行说明。

表6.17  cd命令与运行说明

  

    

cd

切换到当前用户的主目录

cd ..

切换到当前目录的上一层目录,例

如当前目录为/home/student,使用该

命令可以将当前目录移到/home

cd ../..

切换到当前目录的上二层目录,例如

当前目录为/home/student/student1,使

用该命令可以将当前目录移动到/home

cd 

切换当前目录为当前用户的主目录,

适用于任何用户

cd /

切换当前目录到根目录,即返回到/


注意:在Linux中,引用目录名、计算机名或域名时使用正斜杠"/",而在Windows中需使用反斜杠"\"。

例如当前系统中存在目录结构如图6.9所示,其中用户当前目录为/home/student。

 
图6.9  目录结构图

若改变当前目录为/home/director,可以使用相对路径,命令如下:

  1. #pwd  
  2. /home/student  
  3. #cd ../director  
  4. #pwd  
  5. /home/director 

也可以使用绝对路径切换到/home/director,命令如下:

  1. #pwd  
  2. /home/student  
  3. #cd /home/director  
  4. #pwd  
  5. /home/director 

将当前目录由/home/student切换为/home/student/student1,由于student1目录位于student目录下,可以采用相对路径:

  1. #pwd  
  2. /home/student  
  3. #cd student1  
  4. #pwd  
  5. /home/student/student1 

也可以采用绝对路径,命令如下:

  1. #pwd  
  2. /home/student  
  3. #cd /home/student/student1  
  4. #pwd  
  5. /home/student/student1 

从student1目录返回根目录,可以使用命令:

  1. #pwd  
  2. /home/student/student1  
  3. #cd /  
  4.  #pwd  

也可以使用相对路径,命令行为:

  1. #pwd  
  2. /home/student/student1  
  3. #cd ../../..  
  4. #pwd  

 

6.11.4  cp 命令:复制目录或文件

cp命令用于实现文件或目录的复制,与DOS下的copy命令相似。cp命令格式如下:

cp  [选项]   源文件或目录  目标文件或目录 

其中各可用选项意义如下。

-a:常在复制目录时使用。该选项保留链接、文件属性,并递归地复制目录。

-f:如果目标文件或目录已存在,就覆盖它,并且不做提示。

-i:与-f选项正好相反,在覆盖已有文件时,会让用户输入"Y"来确认。

-r:若给出的源是一个目录,那么cp 将递归复制该目录下所有的子目录和文件,不过这要求目标也是一个目录名。

常用的cp命令行组合与运行结果见表6.18。

表6.18  cp命令格式与运行结果

命令格式

运行结果

cp  文件1      文件2

复制源文件1的内容到目标

文件2上,目标文件有一个新

的创建日期和节点索引号

cp  多个文件

(文件名之间用

空格分隔)目录1

复制多个文件到目录1

cp  -f  文件1  文件2

如果已有一个文件2存在,

该命令不显示任何提示就用

文件1覆盖文件2

cp  -i  文件1  文件2

如果已有一个文件2存在,该

命令在覆盖文件2之前会给出提示

cp  -p  目录1  目录2

复制目录1的内容到目录2,如

果目录1下还有子目录,则一并进行复制

cp  -u  文件1  文件2   

果文件2已存在,但文件1

文件2新,则不显示任何提示就覆盖文件2


例如把a.txt 和b.txt文件复制到/home/teacher目录中,命令行如下:

  1. #cp  a.txt  b.txt  /home/teacher 

cp命令可以在同一目录下,换名复制一个文件,源文件保持不变。例如将当前目录下的a.txt文件复制一份且取名为b.txt,放在当前目录下,命令行为:

  1. #cp  a.txt  b.txt 

若源文件是普通文件,则直接复制到目标文件;若是目录,需要使用"-r"选项才能将整个目录复制到目标位置。例如将/home/teacher目录下的所有内容复制到/home/student目录下,命令行为:

  1. #cp  -r  /home/teacher /home/student 

 

 

6.11.5  rm 命令:删除目录或文件

rm命令用于删除文件或目录,可删除一个目录中的一个或多个文件或目录,也可删除某个目录及其下面的所有文件和子目录。对于链接文件则只删除链接,原文件保持不变。rm命令格式如下:

  1. rm  [选项]  文件… 

其中各可用选项意义如下。

-f:在删除过程中不给任何指示,直接删除。

-r:将参数中列出的全部目录和子目录都递归地删除。

-i:与-f选项相反,交互式删除,在删除每个文件时都给出提示。

删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:

  1. # rm  pp.c  
  2. rm:是否删除 一般文件 "pp.c"? y  
  3. # rm  homework  
  4. rm: 无法删除目录"homework": 是一个目录  
  5. # rm  -r  homework  
  6. rm:是否删除 目录 "homework"? y 

例如,删除当前目录下的所有文件及目录,命令行为:

  1. # rm  -r  * 

文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。

6.11.6  mkdir命令:创建目录

mkdir命令用于创建目录。mkdir命令格式为:

  1. mkdir [选项] 目录名 

各可用选项意义如下。

-m数字:设置新建目录的权限,权限用数字表示。

-p:如果目录名的路径中包含着不存在的子目录,那么就逐一地建立,直到最后的子目录为止。

创建目录时,如果目录名前没有指定目录的路径,那么就表示在当前目录下创建;如果有路径名,则在指定的路径下建立。新建的子目录必须不与已经存在的文件名或目录名重名。例如:

  1. # pwd                               //在当前目录下创建子目录zhang  
  2. /home/teacher1  
  3. # ls  
  4. # mkdir zhang  
  5. # ls  
  6. zhang  
  7. # mkdir  /home/teacher1/yang    //使用绝对路径创建子目录yang  
  8. # ls  
  9. yang  zhang  
  10. # mkdir zhang                   //不能重名创建  
  11. mkdir: 无法创建目录 "zhang": 文件已存在 

在创建子目录的时候,如果子目录的父目录不存在,则无法创建。使用选项"-p",则可以逐级创建目录。例如在当前目录下创建li/document目录:

  1. # pwd              
  2. /home/teacher1  
  3. #mkdir  li/document             //由于不存在li子目
    录,li/document子目录无法创建  
  4. mkdir: 无法创建目录 "li/document": 没有那个文件或目录  
  5. # mkdir  -p  li/document        //参数"-p"允许逐级创建目录  
  6. # ls  
  7. li  yang  zhang  
  8. # cd li  
  9. # ls  
  10. document 

再如创建新目录/usr/Bob/example,且指定权限为700,命令行为:

  1. $ mkdir  -m  700  /usr/Bob/example 

 

6.11.7  rmdir命令:删除空目录

rmdir命令用于删除一个空目录。被删除的目录必须是一个空目录否则无法删除。rmdir只用于删除目录,无法删除文件。rmdir命令格式为:

  1. rmdir  [选项]  目录名 

可用选项意义如下。

-p:删除目录下所有空目录,如果有非空的子目录,则保留下来;如果所有的子目录都删除了,则删除该目录。

例如删除document子目录,命令行为:

  1. # ls  
  2. document  
  3. # cd  document  
  4. # ls  
  5. # rmdir  document               //在document子
    目录内无法删除document子目录  
  6. rmdir: document: 没有那个文件或目录  
  7. # cd ..  
  8. # rmdir  document  
  9. # ls 

若没有document的写权限或目录非空则无法删除,例如:

  1. # ls  
  2. li  yang  zhang  
  3. # rmdir  li  
  4. rmdir: li: 目录非空 

 

6.11.8  mv 命令:移动文件或目录

mv 命令用于实现文件或目录的移动。mv命令格式如下:

  1. mv  [选项]  源文件或目录  目标文件或目录 

可用选项意义如下。

-f:如果操作要覆盖某个已有的目标文件时不给任何指示。

-i:交互式的操作,如果操作要覆盖某个已有的目标文件时会询问用户是否覆盖。

mv与cp命令的明显不同之处在于:mv命令移动文件,文件个数没有增加;cp命令复制文件,文件个数增加。mv命令还可以进行文件或目录的改名,其参数设置与运行结果对应关系如表6.19所示。

表6.19  mv参数设置与运行结果

命令格式

运行结果

mv  文件名   文件名

将源文件名改为目标文件名

mv  文件名   目录名

将文件移动到目标目录

mv  目录名   目录名

目标目录已存在,将源目录

移动到目标目录;目标

目录不存在则改名

mv  目录名   文件名

出错


例如将m1.c文件改名为m2.c,命令行为:

  1. $ mv m1.c m2.c 

再如将/usr/student下的所有文件和目录移到当前目录下,命令行为:

  1. $ mv /usr/student/*  . 

 

6.11.9  find 命令:查找文件

find命令用于查找文件,其命令格式为:

  1. find  [起始目录]  [搜索条件]  [操作] 

其中[起始目录]是指命令将从该目录起,遍历其下的所有子目录,查找满足条件的文件。该目录默认是当前目录。[搜索条件]是一个逻辑表达式,当表达式为"真"时,搜索条件成立,为"假"时不成立。搜索条件的一般表达式及其说明见表6.20。

表6.20  find命令搜索条件的一般表达式及其说明

搜索条件

    

-name ‘字符串

查找文件名中包含所给字符串的所有文件

-user ‘用户名

查找属于指定用户的文件

-group ‘用户组名

查找属于指定用户组的文件

-type x

查找类型为x的文件,类型包括b

(块设备文件),c(字符设备文件),

d(目录文件),p(命名管道文件),

f(普通文件),l(符号链接文件),

ssocket文件)


续表 

搜索条件

    

-atime n

查找n天以前被访问过的文件

-size n

指定文件大小为n

-perm

查找符合指定权限值的文件或目录

-mount

要查找文件时不跨越文件系统mount

-follow

如果find命令遇到符号链接文件,

就跟踪到链接所指向的文件

-cpio

对匹配的文件使用cpio命令,将文

件备份到磁带设备中

-newer file1 ! file2

查找更改时间比文件file1晚但比

文件file2早的文件

-prume

不在指定的目录中查找,如果同时

指定-depth选项,那么-prune将被

find命令忽略

-ok

exec作用相同,但在执行每一个

命令之前,都会给出提示,由用户

来确定是否执行

-depth

在查找文件时,首先查找当前目录,

然后再在其他子目录中查找


可执行的操作及其说明见表6.21。 

表6.21  find命令常用可执行操作及其说明

可执行操作

    

-exec 命令名 {} \

不需确认执行命令。注意{}”代

表找到的文件名,“}”与“\”之间有空格

-print

送往标准输出


例如从当前目录查找所有以.txt结尾的文件并在屏幕上显示出来,命令行为:

  1. $ find  .  -name  '*.txt'   -print 

再如从根目录查找类型为符号连接的文件,并将其删除,命令行为:

  1. $ find  /  -type  l  -exec  rm { } \; 

又如从当前目录查找用户tom的所有文件并在屏幕上显示,命令行为:

  1. $ find  .  -user  'tom'   -print 

又如显示当前目录中大于20字节的.c文件名,命令行为:

  1. $ find  . -name  "*.c"  -size  +20c  -print 

显示当前目录中恰好10天前访问过的文件名,命令行为:

  1. $ find  .  -atime  10  -print 

显示当前目录中不到10天前访问过的文件名,命令行为:

  1. $ find  .  -atime  -10  -print 

查找/home目录下权限为640的文件或目录,命令行为:

  1. #find  /home  -perm 640 

搜索根目录下大于100KB的文件,并显示,命令行为:

  1. #find  /  -size  +100K  -print 

搜索根目录下小于500KB的文件,命令行为:

  1. #find  /  -size  -500K  -print 

在当前目录中查找所有文件名以.doc结尾,且更改时间在5天以上的文件,找到后进行删除,且删除前给出提示,命令行为:

  1. #find  .  -name  '*.doc'  -mtime +5  -ok  rm { } \; 

在当前目录下查找所有链接文件,并以长格式显示文件的基本信息,命令行为:

  1. # find  .  -type l  -exec  ls  -l {} \;  
  2. lrw-rw-r-- 1 root root 36 07-27 14:34 ./example2  
  3. lrw-rw-r-- 1 root root 72 07-27 14:36 ./example3  
  4. lrw-rw-r-- 1 root root 36 07-27 14:36 ./example1 

在当前目录中查找文件名由一个小写字母、一个大写字母和两个数字组成,且扩展名为.doc的文件,并显示,命令行为:

  1. #find  .  -name  ' [a-z][A-Z][0-9][0-9].doc'  -print 

 

6.11.10  grep 命令:在文件中搜索指定的字符串

grep命令是"global regular expression print"的缩写,用于在文件中搜索指定的字符串模式,列出含有匹配模式字符串的文件名,并输出含有该字符串的文本行,命令格式为:

  1. grep [选项] [查找模式][文件名……] 

其中各可用选项意义如下。

-F:将查找模式看成是单纯的字符串。

-i:要查找的字符串不区分字母的大小写。

-r:以递归方式查询目录下的所有子目录的文件。

-n:标出包含指定字符串的行编号。

例如在文件example中查找包含"aa"字符串的行,命令如下:

  1. # cat  example  
  2. aa bb cc dd  
  3. aa bb ff  
  4. ee  
  5. # grep  aa  example  
  6. aa bb cc dd  
  7. aa bb ff 

如果待查找的字符串模式的字数大于1,则必须在字符串模式两边使用单引号,否则系统会只把第一个字作为搜索目录,如:

  1. # cat  example  
  2. aa bb cc dd  
  3. aa bb ff  
  4. ee  
  5. # grep  bb  cc  example  
  6. grep: cc: 没有那个文件或目录  
  7. example:aa bb cc dd  
  8. example:aa bb ff  
  9. # grep  'bb cc'  example  
  10. aa bb cc dd 

例如在/passwd文件中查找包含"teacher"字符串的行,命令为:

  1. #grep  -F  teacher  /etc/passwd  
  2. teacher:*:500:500: teacher:/home/ teacher:/bin/bash 

再如在file1中查找包含"print" 字符串的所有行,不管字符的大小写,命令行如下:

  1. # grep  -i  'print'  file1 

又如查找包含字符串"bb cc"的行,输出该行,并输出该行所在的行号,命令为:

  1. # cat  example  
  2. aa bb cc dd  
  3. aa bb ff  
  4. ee  
  5. # grep  -n 'bb cc'  example  
  6. 1:aa bb cc dd 

通常grep命令配合管道符(|)还可用来作为其他命令的输入,例如统计指定文件中包含某字符串的行数、字数和字节数:

  1. # cat  example  
  2. aa bb cc dd  
  3. aa bb ff  
  4. ee  
  5. # grep  'bb' example | wc  
  6.       2       7      21 

grep命令除了作为其他命令的输入,也可以作为一些命令(例如ls,ps)的输出。例如在当前运行的进程中查找vi程序的进程信息,命令行如下:

  1. # ps  aux  |  grep  vi  
  2. root      5716  0.0  0.2   4956   736 pts/1  
    T    Jul25   0:00 vi  
  3. root     20681  0.3  0.4   4960  1012 pts/1   
    T    14:21   0:00 vi  
  4. root     20689  5.0  0.2   4132   668 pts/1   
    R+   14:22   0:00 grep vi 

注意:还有两个命令与grep非常相似。一个是"egrep",表示Extend grep,执行效率比grep高,但需占用较大的内存空间;另一个是"fgrep",占用空间比egrep小,且速度也比grep快。由于三个命令的结构、功能类似,因此大部分参数可以共享。

 

猜你喜欢

转载自xujava.iteye.com/blog/1920809