文件和目录管理涉及的命令比较多,在现存的各个版本的Linux系统中,各命令功能大体相同。
6.11.1 文件和目录操作常用通配符
在Linux文件系统中,可以使用通配符来匹配多个选择。常用的通配符及其说明如表6.14所示。
表6.14 常用通配符及其说明
通 配 符 | 说 明 |
* | 用来代表文件中任意长度的任意字符 |
? | 用来代表文件中的任一个字符 |
[…] | 匹配任意一个在中括号中的字符, 中括号里可以是一个用破折号 格式表示的字母或数字范围 |
前导字符串 {…} 后 继字符串 | 大括号中的字符串逐一匹 配前导字符串和后继字符串 |
例如当前目录下存在cars 、cat、can、cannon、truck、bus和bike等几个文件,要列出所有以字母"c"开头的文件,可使用命令:
#touch car cats can cannon truck bus bike
#ls c*
cars can cannon
列出所有以字母"b"开头的文件名,命令行为:
#ls b*
bike bus
列出所有第一个字母为"c",最后一个字母为"n"的文件,命令行为:
#ls c*n
can cannon
列出包含字母"a"的所有文件,命令行为:
#ls *a*
cars cat can cannon
列出当前目录下的所有文件,命令行为:
#ls *
bike bus cars cat can cannon truck
通配符"?"只能匹配任意一个字符。例如列出上例中所有第三个字母是"n"的文件,命令行为:
#ls ??n*
can cannon
列出第一个字母是"b",第三个字母是"s"的所有文件,命令行为:
#ls b?s*
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开头的文件名,命令行为:
#ls [b,c]*
bike bus car cat can cannon
又如列出所有以字母b或c开头,以字母s或k 结尾的文件,命令行为:
#ls [b,c]*[s,k]
bus cars
大括号是用来查找文件的一个常用方法,例如以长格式列出cars、cans和cats文件的信息,可以使用命令:
#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命令的格式如下:
ls [选项] 目录或文件名
其中各选项意义如下。
-a:列出指定目录下所有文件和子目录的信息(包括隐含文件)。
-A:同-a,但不列出. 和..。
-b:当文件名中有不可显示的字符时,将显示该字符的八进制数字。
-c:按文件的最后修改时间排序。
-C:分成多列显示。
-d:显示目录名而不是显示目录下的内容,一般与-l连用。
-f:在列出的文件名后加上符号来区别不同类型。
-R:递归地显示指定目录的各级子目录中的文件。
-s:给出每个目录项所用的块数,包括间接块。
-t:按最后修改时间排序(新的在前,旧的在后)。
-l:以长格式显示文件的详细信息,包括文件的类型与权限、链接数、文件所有者、文件所有者所属的组、文件大小、最近修改时间及文件名,详情见图6.4。
下面以不同的格式显示目录的内容:
# ls //以缩略格式显示目录内容
cal_txt finger_txt id_txt newgrp_txt
suple_txt who.txtfinger2_txt groups_txt last_txt suple3_txt
suple_txt~ w.txtfinger3_txt groups_txt2 ln suple3_txt~ w
# ls -l //以长格式显示目录内容,包括权限、
用户名、修改时间等总计 224
-rw-r--r-- 1 root root 2163 07-24 13:00 cal_txt
-rw-r--r-- 1 root root 212 07-23 06:37 finger2_txt
-rw-r--r-- 1 root root 0 07-23 06:39 finger3_txt
-rw-r--r-- 1 root root 248 07-23 06:31 finger_txt
-rw-r--r-- 1 root root 35 07-23 04:22 groups_txt
-rw-r--r-- 1 root bin 140 07-23 04:32 groups_txt2
-rw-r--r-- 1 root root 144 07-23 04:11 id_txt
-rw-r--r-- 1 root root 1655 07-22 19:19 last_txt
drwxr-xr-x 5 root root 4096 07-26 09:42 ln
-rw-r--r-- 1 root bin 143 07-23 04:24 newgrp_txt
-rw-r--r-- 1 root root 25098 07-26 19:15 suple3_txt
-rw-r--r-- 1 root root 24031 07-26 16:00 suple3_txt~
-rw-r--r-- 1 root root 25198 07-24 20:16 suple_txt
-rw-r--r-- 1 root root 24827 07-24 20:06 suple_txt~
-rw-r--r-- 2 root root 196 07-23 06:48 w
-rw-r--r-- 1 root root 46 07-23 06:48 who.txt
-rw-r--r-- 2 root root 196 07-23 06:48 w.txt
# ls -s //显示所用的块数
总计 224
8 cal_txt 8 groups_txt 8 ln
32 suple_txt 8 w.txt8 finger2_txt 8 groups_txt2 8 newgrp_txt
32 suple_txt~4 finger3_txt 8 id_txt 32 suple3_txt 8 w
8 finger_txt 8 last_txt 28 suple3_txt~ 8 who.txt
选项可以组合使用。例如,如果需要列出当前目录的所有内容(包括那些以"."开头的隐含文件),并以"冗余格式"在屏幕上输出文件的详细信息,可以使用选项"-al"。以冗余格式显示/root目录下的所有文件,可以使用命令:
# ls -al /root
drwxr-x--- 18 root root 4096 07-26 16:00 .
//当前目录drwxr-xr-x 24 root root 4096 07-25 05:43 ..
//父目录-rw------- 1 root root 997 07-15 20:58
anaconda-ks.cfg //普通文件-rw------- 1 root root 2827 07-24 21:32
.bash_history //隐藏文件-rw-r--r-- 1 root root 24 2006-07-13
.bash_logout //隐藏文件… …
其中文件名为"."表示当前目录,对应行列出了当前目录的详细信息。文件名为".."表示当前目录的上一级目录,即父目录,对应行列出了父目录的详细信息。文件名前有"."符号的文件是隐藏文件,只有使用了"-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,可以使用相对路径,命令如下:
#pwd
/home/student
#cd ../director
#pwd
/home/director
也可以使用绝对路径切换到/home/director,命令如下:
#pwd
/home/student
#cd /home/director
#pwd
/home/director
将当前目录由/home/student切换为/home/student/student1,由于student1目录位于student目录下,可以采用相对路径:
#pwd
/home/student
#cd student1
#pwd
/home/student/student1
也可以采用绝对路径,命令如下:
#pwd
/home/student
#cd /home/student/student1
#pwd
/home/student/student1
从student1目录返回根目录,可以使用命令:
#pwd
/home/student/student1
#cd /
#pwd
/
也可以使用相对路径,命令行为:
#pwd
/home/student/student1
#cd ../../..
#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目录中,命令行如下:
#cp a.txt b.txt /home/teacher
cp命令可以在同一目录下,换名复制一个文件,源文件保持不变。例如将当前目录下的a.txt文件复制一份且取名为b.txt,放在当前目录下,命令行为:
#cp a.txt b.txt
若源文件是普通文件,则直接复制到目标文件;若是目录,需要使用"-r"选项才能将整个目录复制到目标位置。例如将/home/teacher目录下的所有内容复制到/home/student目录下,命令行为:
#cp -r /home/teacher /home/student
6.11.5 rm 命令:删除目录或文件
rm命令用于删除文件或目录,可删除一个目录中的一个或多个文件或目录,也可删除某个目录及其下面的所有文件和子目录。对于链接文件则只删除链接,原文件保持不变。rm命令格式如下:
rm [选项] 文件…
其中各可用选项意义如下。
-f:在删除过程中不给任何指示,直接删除。
-r:将参数中列出的全部目录和子目录都递归地删除。
-i:与-f选项相反,交互式删除,在删除每个文件时都给出提示。
删除文件可以直接使用rm命令,若删除目录则必须配合选项"-r",例如:
# rm pp.c
rm:是否删除 一般文件 "pp.c"? y
# rm homework
rm: 无法删除目录"homework": 是一个目录
# rm -r homework
rm:是否删除 目录 "homework"? y
例如,删除当前目录下的所有文件及目录,命令行为:
# rm -r *
文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。
6.11.6 mkdir命令:创建目录
mkdir命令用于创建目录。mkdir命令格式为:
mkdir [选项] 目录名
各可用选项意义如下。
-m数字:设置新建目录的权限,权限用数字表示。
-p:如果目录名的路径中包含着不存在的子目录,那么就逐一地建立,直到最后的子目录为止。
创建目录时,如果目录名前没有指定目录的路径,那么就表示在当前目录下创建;如果有路径名,则在指定的路径下建立。新建的子目录必须不与已经存在的文件名或目录名重名。例如:
# pwd //在当前目录下创建子目录zhang
/home/teacher1
# ls
# mkdir zhang
# ls
zhang
# mkdir /home/teacher1/yang //使用绝对路径创建子目录yang
# ls
yang zhang
# mkdir zhang //不能重名创建
mkdir: 无法创建目录 "zhang": 文件已存在
在创建子目录的时候,如果子目录的父目录不存在,则无法创建。使用选项"-p",则可以逐级创建目录。例如在当前目录下创建li/document目录:
# pwd
/home/teacher1
#mkdir li/document //由于不存在li子目
录,li/document子目录无法创建mkdir: 无法创建目录 "li/document": 没有那个文件或目录
# mkdir -p li/document //参数"-p"允许逐级创建目录
# ls
li yang zhang
# cd li
# ls
document
再如创建新目录/usr/Bob/example,且指定权限为700,命令行为:
$ mkdir -m 700 /usr/Bob/example
6.11.7 rmdir命令:删除空目录
rmdir命令用于删除一个空目录。被删除的目录必须是一个空目录否则无法删除。rmdir只用于删除目录,无法删除文件。rmdir命令格式为:
rmdir [选项] 目录名
可用选项意义如下。
-p:删除目录下所有空目录,如果有非空的子目录,则保留下来;如果所有的子目录都删除了,则删除该目录。
例如删除document子目录,命令行为:
# ls
document
# cd document
# ls
# rmdir document //在document子
目录内无法删除document子目录rmdir: document: 没有那个文件或目录
# cd ..
# rmdir document
# ls
若没有document的写权限或目录非空则无法删除,例如:
# ls
li yang zhang
# rmdir li
rmdir: li: 目录非空
6.11.8 mv 命令:移动文件或目录
mv 命令用于实现文件或目录的移动。mv命令格式如下:
mv [选项] 源文件或目录 目标文件或目录
可用选项意义如下。
-f:如果操作要覆盖某个已有的目标文件时不给任何指示。
-i:交互式的操作,如果操作要覆盖某个已有的目标文件时会询问用户是否覆盖。
mv与cp命令的明显不同之处在于:mv命令移动文件,文件个数没有增加;cp命令复制文件,文件个数增加。mv命令还可以进行文件或目录的改名,其参数设置与运行结果对应关系如表6.19所示。
表6.19 mv参数设置与运行结果
命令格式 | 运行结果 |
mv 文件名 文件名 | 将源文件名改为目标文件名 |
mv 文件名 目录名 | 将文件移动到目标目录 |
mv 目录名 目录名 | 目标目录已存在,将源目录 移动到目标目录;目标 目录不存在则改名 |
mv 目录名 文件名 | 出错 |
例如将m1.c文件改名为m2.c,命令行为:
$ mv m1.c m2.c
再如将/usr/student下的所有文件和目录移到当前目录下,命令行为:
$ mv /usr/student/* .
6.11.9 find 命令:查找文件
find命令用于查找文件,其命令格式为:
find [起始目录] [搜索条件] [操作]
其中[起始目录]是指命令将从该目录起,遍历其下的所有子目录,查找满足条件的文件。该目录默认是当前目录。[搜索条件]是一个逻辑表达式,当表达式为"真"时,搜索条件成立,为"假"时不成立。搜索条件的一般表达式及其说明见表6.20。
表6.20 find命令搜索条件的一般表达式及其说明
搜索条件 | 说 明 |
-name ‘ 字符串 ’ | 查找文件名中包含所给字符串的所有文件 |
-user ‘ 用户名 ’ | 查找属于指定用户的文件 |
-group ‘ 用户组名 ’ | 查找属于指定用户组的文件 |
-type x | 查找类型为 x 的文件,类型包括 b (块设备文件), c (字符设备文件), d (目录文件), p (命名管道文件), f (普通文件), l (符号链接文件), s ( socket 文件) |
续表
搜索条件 | 说 明 |
-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 命令名 {} \ ; | 不需确认执行命令。注意 : “ {} ”代 表找到的文件名,“ } ”与“ \ ”之间有空格 |
送往标准输出 |
例如从当前目录查找所有以.txt结尾的文件并在屏幕上显示出来,命令行为:
$ find . -name '*.txt' -print
再如从根目录查找类型为符号连接的文件,并将其删除,命令行为:
$ find / -type l -exec rm { } \;
又如从当前目录查找用户tom的所有文件并在屏幕上显示,命令行为:
$ find . -user 'tom' -print
又如显示当前目录中大于20字节的.c文件名,命令行为:
$ find . -name "*.c" -size +20c -print
显示当前目录中恰好10天前访问过的文件名,命令行为:
$ find . -atime 10 -print
显示当前目录中不到10天前访问过的文件名,命令行为:
$ find . -atime -10 -print
查找/home目录下权限为640的文件或目录,命令行为:
#find /home -perm 640
搜索根目录下大于100KB的文件,并显示,命令行为:
#find / -size +100K -print
搜索根目录下小于500KB的文件,命令行为:
#find / -size -500K -print
在当前目录中查找所有文件名以.doc结尾,且更改时间在5天以上的文件,找到后进行删除,且删除前给出提示,命令行为:
#find . -name '*.doc' -mtime +5 -ok rm { } \;
在当前目录下查找所有链接文件,并以长格式显示文件的基本信息,命令行为:
# find . -type l -exec ls -l {} \;
lrw-rw-r-- 1 root root 36 07-27 14:34 ./example2
lrw-rw-r-- 1 root root 72 07-27 14:36 ./example3
lrw-rw-r-- 1 root root 36 07-27 14:36 ./example1
在当前目录中查找文件名由一个小写字母、一个大写字母和两个数字组成,且扩展名为.doc的文件,并显示,命令行为:
#find . -name ' [a-z][A-Z][0-9][0-9].doc' -print
6.11.10 grep 命令:在文件中搜索指定的字符串
grep命令是"global regular expression print"的缩写,用于在文件中搜索指定的字符串模式,列出含有匹配模式字符串的文件名,并输出含有该字符串的文本行,命令格式为:
grep [选项] [查找模式][文件名……]
其中各可用选项意义如下。
-F:将查找模式看成是单纯的字符串。
-i:要查找的字符串不区分字母的大小写。
-r:以递归方式查询目录下的所有子目录的文件。
-n:标出包含指定字符串的行编号。
例如在文件example中查找包含"aa"字符串的行,命令如下:
# cat example
aa bb cc dd
aa bb ff
ee
# grep aa example
aa bb cc dd
aa bb ff
如果待查找的字符串模式的字数大于1,则必须在字符串模式两边使用单引号,否则系统会只把第一个字作为搜索目录,如:
# cat example
aa bb cc dd
aa bb ff
ee
# grep bb cc example
grep: cc: 没有那个文件或目录
example:aa bb cc dd
example:aa bb ff
# grep 'bb cc' example
aa bb cc dd
例如在/passwd文件中查找包含"teacher"字符串的行,命令为:
#grep -F teacher /etc/passwd
teacher:*:500:500: teacher:/home/ teacher:/bin/bash
再如在file1中查找包含"print" 字符串的所有行,不管字符的大小写,命令行如下:
# grep -i 'print' file1
又如查找包含字符串"bb cc"的行,输出该行,并输出该行所在的行号,命令为:
# cat example
aa bb cc dd
aa bb ff
ee
# grep -n 'bb cc' example
1:aa bb cc dd
通常grep命令配合管道符(|)还可用来作为其他命令的输入,例如统计指定文件中包含某字符串的行数、字数和字节数:
# cat example
aa bb cc dd
aa bb ff
ee
# grep 'bb' example | wc
2 7 21
grep命令除了作为其他命令的输入,也可以作为一些命令(例如ls,ps)的输出。例如在当前运行的进程中查找vi程序的进程信息,命令行如下:
# ps aux | grep vi
root 5716 0.0 0.2 4956 736 pts/1
T Jul25 0:00 viroot 20681 0.3 0.4 4960 1012 pts/1
T 14:21 0:00 viroot 20689 5.0 0.2 4132 668 pts/1
R+ 14:22 0:00 grep vi
注意:还有两个命令与grep非常相似。一个是"egrep",表示Extend grep,执行效率比grep高,但需占用较大的内存空间;另一个是"fgrep",占用空间比egrep小,且速度也比grep快。由于三个命令的结构、功能类似,因此大部分参数可以共享。