天天看点

c语言中感叹号在条件后面,find命令使用, -exec xargs

find [path]   [expression]

例如:find  /home  -name  \*.o  -exec rm '{}' \;

find:

实时精确,支持众多查找标准,遍历指定目录中的所有文件完成查找,速度慢;

find 【查找路径】 【查找标准】 【查找到以后的处理运作】

查找路径:默认为当前目录

查找标准:默认为指定路径下的所有文件

如果想只需要目录列表可以用如下进行测试:

find  /  -type d | wc -l

-type d 限制了只搜索目录

find  / -type f |wc -l

普通文件列表

-name   后面文件名称用双引号,是防止 shell 展开路径名

-size 后面跟随文件或者目录大小 +-表示大于规定或者小于规定的值

下面的字符可以被用来指定测量单位:

字符                                    单位

b  512 个字节块。如果没有指定单位,则这是默认值。

c  字节

w  两个字节的字

k   千字节 (1024 个字节单位)

M  兆字节 (1048576 个字节单位)

G  千兆字节 (1073741824 个字节单位)

测试条件                            描述

-

cmin

n 匹配的文件和目录的内容或属性最后修改时间正好在 n 分钟之前。指定少于 n 分钟之前,使用 -n,指定多于 n 分钟 之前,使用 +n。

-

cnewer

file 匹配的文件和目录的内容或属性最后修改时间早于那些文件。

-

ctime

n 匹配的文件和目录的内容和属性最后修改时间在 n\*24 小时之前。

-

empty

匹配空文件和目录。

-

group name

匹配的文件和目录属于一个组。组可以用组名或组 ID 来表示。

-

iname pattern

就像 -name 测试条件,但是大小写敏感。

-inum n 匹配的文件的 inode 号是 n。这对于找到某个特殊 inode 的所有硬链接很有帮助。

-

mmin

n 匹配的文件或目录的内容被修改于 n 分钟之前。

-

mtime

n 匹配的文件或目录的内容被修改于 n\*24 小时之前。

-name pattern 用指定的通配符模式匹配的文件和目录。

-

newer

file 匹配的文件和目录的内容早于指定的文件。当编写 shell 脚本,做文件备份时,非常有帮助。每次你制作一个备份,更新文件(比如说日志) ,然后使用 find 命令来决定自从上次更新,哪一个文件已经更改了。

-

nouser

匹配的文件和目录不属于一个有效用户。这可以用来查找属于删除帐户的文件或监测攻击行为。

-

nogroup

匹配的文件和目录不属于一个有效的组。

-

perm

mode 匹配的文件和目录的权限已经设置为指定的 mode。mode可以用八进制或符号表示法。

-

samefile

name 相似于 -inum 测试条件。匹配和文件 name 享有同样 inode号的文件。

-

size

n 匹配的文件大小为 n。

-

type

c 匹配的文件类型是 c。

-

user

name 匹配的文件或目录属于某个用户。这个用户可以通过用户名或用户 ID 来表示。

find 命令的逻辑操作符

因为圆括号对于 shell 有特殊含义,我们必须转义它们,来阻止 shell 解释它们。在 圆括号字符之前加上一个反斜杠字符来转义它们。

操作符                      描述

-and     匹配如果操作符两边的测试条件都是真。可以简写为 -a。

注意若没有使用操作符,则默认使用 -and。

相当于c语言中的&&

-or        匹配若操作符两边的任一个测试条件为真。可以简写为 -o。

相当于C语言中的||

-not      匹配若操作符后面的测试条件是真。可以简写为一个感叹号 (!) 。

和c语言中的!一样

()          把测试条件和操作符组合起来形成更大的表达式。这用来 控制逻辑计算的优先级。默认情况下,find 命令按照从左到 右的顺序计算。经常有必要重写默认的求值顺序,以得到期 望的结果。即使没有必要,有时候包括组合起来的字符,对 提高命令的可读性是很有帮助的。注意因为圆括号字符对 于 shell 来说有特殊含义,所以在命令行中使用它们的时候, 它们必须用引号引起来,才能作为实参传递给 find 命令。 通常反斜杠字符被用来转义圆括号字符。

预定义的操作

操作                       描述

-delete 删除当前匹配的文件。

-ls 对匹配的文件执行等同的 ls -dils 命令。并将结果发送到标准输出。

-print 把匹配文件的全路径名输送到标准输出。如果没有指定其它操作,这是默认操作。

-quit 一旦找到一个匹配,退出。这里是 find 命令支持的普通文件类型测试条件:

find ~ -type f -name '*.BAK' -print

记住,在每个测试和操作之间会默 认应用

-and逻辑运算符。我们也可以这样表达这个命令,使逻辑关系更容易看出:

find ~ -type f -and -name '*.BAK' -and -print

用户定义的行为

-exec command {} ;

{}表示find查找到一个文件的结果 后面;表示结束。

这里的 command 就是指一个命令的名字,{} 是当前路径名的符号表示,分号是要求的界定符表明命令结束。

除了预定义的行为之外,我们也可以唤醒随意的命令。传统方式是通过 -exec 行为。

当 -exec 行为被使用的时候,若每次找到一个匹配的文件,它会启动一个新的指定命令的实 例。我们可能更愿意把所有的搜索结果结合起来,再运行一个命令的实例。

ls -l file1

ls -l file2

ls -l file1 file2

上面命令表示显示file1 file2的详细信息,我们更喜欢用第3个命令的方法来表示file1 file2 这里就涉及到一个效率问题,

ls-l 命令执行次数最少效率最高

观察下面两条命令:

find ~ -type f -name 'foo*' -exec ls -l '{}' ';'

find ~ -type f -name 'foo*' -exec ls -l '{}' +

执行效果是一样的,但是第二条命令只执行了一次ls -l 。

虽然我们得到一样的结果,但是系统只需要执行一次 ls 命令。

xargs

这个 xargs 命令会执行一个有趣的函数。它从标准输入接受输入,并把输入转换为一个特 定命令的参数列表。

文件类型 描述

b  块设备文件

c  字符设备文件

d  目录

f  普通文件

l:link,链接文件

p:pipe,管道文件

s:socket,套接字文件

find  ~ -type d | wc -l

匹配标准:

-name 'FILENAME':对文件名作精确匹配

文件名通配:

-iname 'FILENAME':文件名匹配时不区分大小写

-regex PATTERN:基于正则表达式进行文件名匹配

-user USERNAME:根据属主查找

-group GROUPNAME:根据属组查找

-uid UID:根据UID查找

-gid GID:根据GID查找

-nouser:查找没有属主的用户

-nogroup:查找没有属组的用户

-type  类型查找

-size

[+|-]#k     ##大于#k,小于#k

#M

#G

组合条件:

-a

-o

-not

根据时间戳查找:

-mtime:根据修改时间(写入而修改)modify

-ctime:根据改变时间(改变文件内容,权限,所属组主或者设置链接随inode类容更改而更改)change

-atime:根据访问时间(读取执行修改) access

[+|-]#:+号表示#天之前,-号表示#天之内

[[email protected] ~]# find ./ -amin -5    ##查找并显示当前目录下,5分钟之内访问过的文件

-perm MODE:精确匹配

/MODE:任意一位匹配即满足条件

-MODE:文件权限能完全包含此MODE时才能显示

[[email protected] ~]# find ./ -perm -644     ##完全匹配

[[email protected] ~]# find ./ -perm /644     ##任意匹配

处理动作:

-print:显示

-ls:类似ls -l的形式显示每一个文件的详细信息

-ok COMMAND {} \;每一次操作都需要用户确认

-exec COMMAND {} \;不需要确认

[[email protected] ~]#

find ./ -perm -006 -exec chmod o-w  {} \;

##{}表示引用找到的文件,后面以\;

xargs

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。它把一个数据流分割为一些足够小的块,以方便过滤器和命令进行处理。通常情况下,xargs从管道或者stdin中读取数据,但是它也能够从文件的输出中读取数据。xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代。

###################使用 i 参数 ##################

[[email protected] ab]# find . -type f -name "*.txt" | xargs -i cp {}  /tmp/k/

[[email protected] ab]# ls ../k/

mini.txt  nii.txt  ni.txt

[[email protected] ab]#

###################  使用 I  参数 ################

[[email protected] ab]# find . -type f -name "*.txt" | xargs -I {} cp {}  /tmp/n/

[[email protected] ab]# ls ../n/

mini.txt  nii.txt  ni.txt

结果出来了,

加-i 参数直接用 {}就能代替管道之前的标准输出的内容;

加 -I 参数 需要事先指定替换字符

xargs具体用法,请参考余力的帖子

http://www.aminglinux.com/bbs/thread-7093-1-1.html