《LINUX与UNIX SHELL编程指南》读书笔记(二)
第 2 章)D3~#P#~.k
使用 find 和 xargs
!g X'w-v.O P$x)l2|-W&i1.有时可能需要在系统中查找具有某一特征的文件(如文件权限、文件属主、文件长度、文件类型等)。find是一个非常有效的工具,它可以递归式遍历当前目录甚至于整个文件系统(本地和网络文件系统)来查找某些文件或目录,只要你具有相应的文件或目录的权限。 1y7}%r!z"_#R*L:J(N
2B;t.c*I"V2V)Z
2.find 命令的使用 #q3G,s)J&~!{
1) Usage : find [path_name ...] [expression] tech.techweb.com.cn#w.f/w$i$y,K
2) path_name : 用于指定要搜索的目录,可以是以空格分隔的多个目录路径的列表。如果省略此参数,默认使用当前目录。
&P;^'l"P;@#I&x9o,S,GTechWeb-技术社区7A+} X)v"u,k;q
3) expression : 用于指定搜索的方式、条件和要执行的操作等。如果 expression 省略,则默认使用 -print 作为 expression。expression 可由 4 类项目组成: tech.techweb.com.cn,Q&t4U8@ k1N:f-m P;H;U
① OPTION(选项) : 用于指定 find 命令的搜索方式,一般把 OPTION 放在 expression 的开头。
*O(_*_/?9K)N$Y.O'O程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛② TEST(测试) : 用于指定 find 命令的检索条件,只有符号条件的文件才会被指定的 ACTION 处理。.}6A"~ ~0?"m6Q
③ ACTION(操作) : 用于指定对 find 的搜索结果执行的操作。省略 ACTION 时预设为 -print。1N&H&g-F)R#X"l"u
④ OPERATOR(运算) : 对 TEST 或 ACTION 进行与、或、非
%E+j/O1@8u%B#]6W9rTechWeb-技术社区等运算。
*H"w5?6x+\!]&[4) find 在执行时,一般会将第 1 个"-"字符之后的命令行参数都看作 expression,把之前的参数都看作为要搜索的路径。
(J/`;^*^;[&E4j$r
0b%D/b!p8~;n3.常用的 OPTION 项目
#Q(?-e1T(J%a/q7E0) OPTION 项目可以省略,find 默认从指定路径目录开始递归地向下层子目录搜索。
.@8g1d;[-l.b7Q!| t/N1) -depth : 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
4u6~!a%@#l;?#v%B.T,m程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2) -maxdepth level : 进入指定的目录下层目录搜索时,最深不超过 level(一个非负整数)层。 :q.R0m)M#k+k,p
eg: find . -maxdepth 0 -name "1" // 只在当前目录而不向下层子目录搜索名为"1"的文件或目录 1n6O'U/X)Q
3) -follow : 如果 find 命令遇到符号链接文件,就跟踪至链接所指向的文件。
8A%y:?7b#T @ {"?.`+|程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4) -mount : 不搜索其它文件系统上的目录(不跨越文件系统 mount 点)。 TechWeb-技术社区'F:{+]6p7B
5) -daystart : 从当日起始时开始而不是从 24 小时之前开始计算时间(如-amin, -atime, -cmin, -ctime, -mmin 和 -mtime )。
5n"I'|,u-C9U(w'y6) -noleaf : 不为"目录中子目录数量比硬链接数少 2"这种假设做优化。这个选项在搜索那些不遵循 UNIX文件系统链接约定的文件系统(比如 CD-ROM,MS-DOS 文件系统或 AFS 卷的加载点)时使用。在普通的 UNIX 文件系统中,每个目录至少有两个硬链接: 它的名字和它的'.'条目。另外,它的每个子目录(假如有的话)还会各有一个'..'链接到它。在 find 检索一个目录时,发现子目录数比它的链接数少二时,它就知道目录中的其他条目并非目录(而是目录树中的叶(`leaf')节点)。除非需要检索的是这个叶节点,否则没必要去处理它。这样可以带来很大的搜索搜索速度的提升。 TechWeb-技术社区0U%y:B*I4c9j;U,x
8J,?6]#B'}/q程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛4.常用的 TEST 项目
6A!k$N)O#i/t;Q5L:b,`!h0) 在 TEST 项目的一些选项中有时会使用数字,数字 N(非负整数)可以以 3 种形式给出: 8H/o3o&~0`)\;c'Q&e!A
+N 表示比 N 大, -N 表示比 N 小, N 表示正好是 N !m7g3|3j4U
1) -name PATTERN : 查找文件名符合模式 PATTERN(一般要加双引号)的文件,也可直接使用文件名。 TechWeb-技术社区.Z#Y#M&[/R-{,^1w&n4W,Y
eg: find . -name "[a-z][a-z][0-9][0-9].txt" -print // 此命令可以返回名为 ax37.txt 的文件
&F*[$U/t5d/n7H)k+`5o1t#R2) -empty : 查找空白文件,它可以是一般文件或目录。
'c#e L!O2T!c3Q/Z j$]3) -lname PATTERN: 只查找符合 PATTERN 的符号链接文件。 "t-g+B1i8D+Y%d
4) -iname 和 -ilname : 分别与 -name 和 -lname 类似,只是不区分大小写。 TechWeb-技术社区&F"M,z&i/p"J2K
5) -regex PATTERN : 查找完整文件名符合模式 PATTERN 的文件。
*q6S#Y.w5V-[8ZTechWeb-技术社区6) -type C : 查找某一类型的文件。C 可以是 b c d p l s f (块设备
0z$@*T!Z,G4X程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛字符设备
,o9`"e-I.P3m目录9R7D.c-I)B:n(^*A2c+W+y+]
命名管道TechWeb-技术社区6\4q7n5D%Q(@
符号链接 4R'K5Z&@9p+\7T
socket 正规文件)。
(J;{0~+|&seg: find ~ -type l // 此命令返回当前用户的主目录内所有的符号链接文件的文件名 TechWeb-技术社区9F1i%C!K8W$E0R*g
7) -size N[bckw] :查找使用 N 个单位空间的文件,可以使用 b(块,512 字节) c(字节) k(KB) w(2 字节)为tech.techweb.com.cn*G2r/m&w$[
单位,不带单位时预设为 b。 6~%Z C!c%W5c
eg: find ~ -size +100k -size -1024k // 此命令返回文件尺寸大于 100k 小于 1M 的文件的文件名 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#C8x$o(Y'F3`,p:w+c&|
8) -fstype FSTYPE : 查找位于某一类型文件系统中的文件,如 vfat ext3 nfs 等
.r+w#V t/]'q5I!Ftech.techweb.com.cn9) -user USERNAME : 查找文件属主为 USERNAME 的文件。
%s(^-y5c9A Z V!l'C2P-uid UID : 查找文件属主的 uid 为 UID 的文件。 .e!~,d @*F
10) -group GROUPNAME : 查找文件所属组为 GROUPNAME 的文件。
9[)y%Z!|&D6T/Gtech.techweb.com.cn-gid GID : 查找文件所属组的 gid 为 GID 的文件。 6B5?4F4t8A"]4l
11) -nouser : 查找无有效属主的文件,即该文件的属主在/etc/passwd 中不存在。 tech.techweb.com.cn1H8n z.e Z8V8A8j#O
-nogroup : 查找无有效所属组的文件,即该文件所属的组在/etc/groups 中不存在。 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛+F(e0n){4M$^!W
12) -perm MODE : 查找文件的权限设置等于 MODE 的文件。MODE 前可加"+"或"-",表示权限设置比 MODE 宽松)
j3j2Z4M'D!_/v#C:~TechWeb-技术社区或更严格。 TechWeb-技术社区5v!p*M+F!b#u9t
13) -anewer FILENAME : 查找其存取(access)时间比文件 FILENAME 的修改时间更接近现在的文件。 TechWeb-技术社区:c)u5l2O6t6P4E3K"e
-cnewer FILENAME : 查找其状态改变(change)时间比文件 FILENAME 的修改时间更接近现在的文件。
'`#`9O;|8].r8i-newer FILENAME : 查找其内容修改(modify)时间比文件 FILENAME 的修改时间更接近现在的文件。
4u1q,_0D3~:[$J:|3\8L"@-amin N : 查找在指定时间(N 为分钟)被存取过的文件。 &l-q,k6U9i5I"?0r
-cmin N : 查找在指定时间(N 为分钟)更改过文件状态的文件。
(`-H!?,F:]&[/f#|0|'h/i5aTechWeb-技术社区-mmin N : 查找在指定时间(N 为分钟)修改过数据内容的文件。
.b:X/S&v f-atime N : 查找在指定时间(N 为天)被存取过的文件。 tech.techweb.com.cn8i0M X8s1O/?'m
-ctime N : 查找在指定时间(N 为天)更改过文件状态的文件。
0h#r2t0R6_程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛-mtime N : 查找在指定时间(N 为天)修改过数据内容的文件。6s6t-Q*\4`
注: 上面这些选项分别涉及到文件的 3 种时间: 文件存取时间(access)、文件状态改变时间(status change) 和)B6D2j$`8u3^%^
文件内容修改时间(modify),也就是在 ls -l 命令输出中显示的时间。
(f,R:p7j,a6^*y"w-^程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛3o+G+S*Y/`#S Y6z-R-k
5.常用 ACTION '`!R&h f0B/N
1) -print : 以完整文件路径名的形式将 find 的搜索结果显示到标准输出,以 NEWLINE 分隔各个文件名。 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛$M4n;z9m#} @3~*H9^%I${
2) -ls : 以"ls -l"命令的格式将 find 的搜索结果显示到标准输出。
$~/?;c5N1K6T;x"C#]tech.techweb.com.cn3) -exec CMD {} \; : 把 find 的搜索结果作为 shell 程序 CMD 的文件名参数,并执行 CMD 程序。 TechWeb-技术社区9c4d5o;M6\7q;t:I&C
eg: find /logs -mtime +5 -exec rm -rf {} \; // 删除/logs 目录中更改时间在 5 日以前的文件
.g)R U!S;f!c:k*k4) -ok CMD {} \; : 同上,是一种更安全的模式,在执行每个命令前,会提示用户来确定是否执行。
2T9k%I.Q,M D'QTechWeb-技术社区4W'}0p:|:C*M U:h
6.常用的 OPERATOR 8z0g"^;y6m2W1M
1) EXPR1 EXPR2 或 EXPR1 -a EXPR2 或 EXPR1 -and EXPR2 : 把 2 个 EXPR 相与。 "`;q"C"{#N1D
eg: find ~zqf -size +10k -name "*.c" // 从 zqf 的主目录开始搜索大于 10kB 的 C 源程序文件
8t9a,i3q3M5Y程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛2) EXPRT1 -o EXPR2 或 EXPR1 -or EXPR2 : 把 2 个 EXPR 相或。
$|0})e*V!{tech.techweb.com.cneg: find . -name "*.c" -or -name "*.cpp" // 从当前目录开始搜索 C 或 C++源程序文件 TechWeb-技术社区1L"N4|([)y6Y)|
3) ! EXPR 或 -not EXPR : 对 EXPR 取反。
3@"H&q3a3k8DTechWeb-技术社区eg: find ~zqf ! -user zqf // 查找 zqf 的主目录中属主不是 zqf 的文件或目录 4N:x.i5a+H0C1?(^
4) ( EXPR ) : 当出现多个 OPERATOR 时,用来改变 OPERATOR 的运算顺序。
9?"o4x;E5f程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛eg: find . ! \( -user zqf -name "*.awk" \)
(k!a#t7N)c0M&F9s-f9nTechWeb-技术社区
#c8a6c8R0O:x8a0i0w7.xargs (x$_ S8K/Z P!j:U,z
1) Usage: xargs CMD (从管道中获取 CMD 命令的参数) 程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛#{3N%v4N)?,H:l
2) xargs 常常与 find 命令一起使用,用于取代 find 的-exec 参数。有几个原因:
2R1{0b3v2e3Btech.techweb.com.cn① find 的-exec 参数有很多局限。比如,递给 exec 的命令长度有限制,在某些系统上-exec 参数只能调用很少的 shell 命令等。
5a!T6[*a6w.v2p②
'y:q4g7g*[1c:~6}(t(]某些系统上-exec CMD 选项会为 find 的搜索结果中的每一个文件名启动一个 CMD 进程,而不是把搜索结果作为一个参数文件列表整个传给 CMD 程序,当搜索结构很多时,会严重影响系统性能。xargs CMD 把从管道获取的参数作为一个参数列表一次传给CMD程序。
|