当我这样做时
rm file.txt
或
rm *.txt
系统会提示我输入每个文件,因为我没有将
-f
选项指定为 rm
。
但是当我这样做时:
find . -type f -name '*.txt' | xargs rm
文件未经确认即被删除。
这背后的逻辑是什么?是否可以在某些文档中找到原因?我无法解释为什么会出现这种情况。
您已将 rm 命令的别名设置为“rm -i”。因此,如果您像
中那样直接调用该命令rm file.txt
或
rm *.txt
别名将被扩展。如果您将使用 xargs 来调用它,如
find . -type f -name '*.txt' | xargs rm
rm 作为简单的字符串参数传递给 xargs,稍后由 xargs 调用,而无需 shell 的别名替换。 您的别名可能在 ~/.bashrc 中定义,以防您想删除它。
您可以使用这个简单的命令来解决您的问题
find . -type f -name '*.txt' -delete
根据您的 xargs 版本,您可能可以使用 --no-run-if-empty GNU 扩展选项:
find . -type f -name '*.txt' | xargs --no-run-if-empty rm -rf
ls "fnames with wild chars" | xargs -I{} rm -v {}
这里
-I{}
用于替换所有替换为 {}
的输入。
注意:使用带有不正确通配符的名称可能会造成灾难性的后果,因为删除的文件将无法检索。谨慎使用它并尽量避免使用递归(-r)标志。
您想要将 PATH_DIR2 中的现有文件删除到 PATH_DIR1 中:
find PATH_DIR1 -type f -exec basename '{}' ';' | xargs printf -- 'PATH_DIR2/%s\n' | xargs rm
说明:
查找 PATH_DIR1 -type f -exec basename '{}' ';'
xargs printf -- 'PATH_DIR2/%s '
xargs rm