find命令与-exec、xargs选项配合使用技巧
一、默认情况下, find命令每输出一个文件名, 后面都会接着输出一个换行符 ('\n'), 因此我们看到的find的输出都是一行一行的。
二、xargs选项默认是以空白字符(空格,TAB,换行符)来分割记录的,例如文件名./file 1.log被解释成了两个记录./file和1.log,不幸的是rm找不到这两个文件。
三、为了解决此类问题,聪明的人想出了一个办法,让find 在打印出一个文件名之后接着输出一个NULL字符 ('\0')而不是换行符,然后再告诉xargs也用NULL字符来作为记录的分隔符。这就是find的-print0和xargs的-0的来历。
例如:
find . -name "*.txt" -exec rm {} \;
find . -name "*.txt" | xargs rm {}
-exec
1、数是一个一个传递的,传递一个参数执行一次rm
2、文件名有空格等特殊字符也能处理
-xargs
xargs命令的作用是将参数列表转换成小块分段传递给其他命令,以避免参数列表过长的问题。
1、一次将参数传给命令,可以使用-n控制参数个数
2、处理特殊文件名需要采用如下方式:
find . -name "*.txt" print0 | xargs -0 rm {}
实验结果如下,可以清楚看到参数传递过程:
# find . -type f | xargs -t -n 2 echo
echo ./data.txt ./env2.txt
echo ./data.txt ./env2.txt
echo ./env.txt ./export2.txt
# find . -type f -exec echo begin {} \;
begin ./data.txt
begin ./env2.txt
begin ./env.txt
技巧:find -print0与xargs -0的结合避免文件名有特殊字符如空格,引号等无法处理:
# find . -name "*.txt" print0 | xargs -0 rm {}
留言评论