使用 xargs 删除不匹配模式的文件

使用 xargs 删除不匹配模式的文件

以下命令来自https://www.tecmint.com/xargs-command-examples/示例#9。从当前目录中删除不匹配 *gz 的文件。

$ find . -type f -not -name '*gz' -print0 | xargs -0 -I {} rm -v {}

命令-print0的参数和命令的参数有什么用途?为什么需要它们?谢谢!find-0-I {}xargs

答案1

-print0指示find以空字节而不是通常的换行符分隔输出结果。如果文件名本身包含换行符(或将来可能包含换行符),则这是必要的。

然后,您需要告知xargs管道中预期有空分隔数据 - 这就是 的用途。因此,在 LHS 上-0使用时,这是必需的。-print0

同时{}是一个替换字符串 - 当您使用时-I {}{}以下命令中的每个都将被替换为输入项。只有当您需要控制项在以下命令行中出现的位置时,它才是真正必要的(并且具有为每个项运行一次调用的副作用,相当于添加)。恕我直言,这里没有必要,并且由于它对找到的每个文件运行一次,而不是批量运行,-L 1因此解决方案效率低下。rm

请注意,find有一个-exec选项和一个-delete选项可以完全避免写入/读取分隔数据的问题:

find . -type f -not -name '*gz' -exec rm -v {} +

或者

find . -type f -not -name '*gz' -print -delete

-print此处提供与-v选项类似的功能rm)。

相关内容