今天继续上一次find命令的内容,主要是find和 -exec 和xargs的结合和使用。
(9) find 命令可以借助选项-exec与其他命令进行结合。- exec算得上是find最强大的特性之一。
比如我们要将某位用户全部文件的所有权更换为另一个用户(比如root),那么就可以用 -user找出root拥有的所有文件,然后用-exec更改所有权。(注意你必须以root用户的身份执行find命令才能进行所有权的更改)
例1:
# find . -type f -user root -exec chown slynux {} \;
在这个命令中,{ }是一个与-exec选项搭配使用的特殊字符串。对于每一个匹配的文件,{ }会被替换成相应的文件名。例如,find命令找到两个文件test1.txt和text.txt,其所有者均为slynux,那么find就会执行:
chown slynux {} 它会被解析为 chown slynux test1.txt 和 chown slynux test2.txt。
例2:
将给定目录中的所有C程序文件拼接起来写入单个文件all_c_files.txt。我们可以用find找到所有C文件,然后结合-exec 使用cat命令:
$ find . -type f -name "*.c" -exec cat {} \ > all_c_file.txt
-exec 之后可以接任何命令。 { }表示一个匹配。对于任何匹配的文件名, { } 均会被改文件名所替换。
例3:
用下列命令将10天前的.txt文件复制到OLD目录中:
$ find -type f - name "*.txt" -mtime -10 -exec cp {} OLD \;
-exec 能够同printf结合来生成有用的输出信息。例如
$ find . -type f -name "*.txt" -exec printf "Text file: %s\n" {} \;
(10): 让find跳过特定的目录
在搜索目录并执行某些操作时,有时为了提高性能,需要跳出一些子目录。将某些文件或目录从搜索过程中排除在外的技巧被称之为修建。其操作方法如下:
$ find . \( -name "*.git" prune\) -o \(-type f -print\)
# 代替直接使用 \( -type f -print\), 而是选择需要的过滤器
以上命令打印出不包括在.git目录中的所有文件的名称(路径)。