使用 find 和 xargs 使用 rm 删除文件

问题描述 投票:0回答:5

当我这样做时

rm file.txt

rm *.txt

系统会提示我输入每个文件,因为我没有将

-f
选项指定为
rm

但是当我这样做时:

find . -type f -name '*.txt' | xargs rm

文件未经确认即被删除。

这背后的逻辑是什么?是否可以在某些文档中找到原因?我无法解释为什么会出现这种情况。

linux xargs rm
5个回答
32
投票

您已将 rm 命令的别名设置为“rm -i”。因此,如果您像

中那样直接调用该命令
rm file.txt

rm *.txt

别名将被扩展。如果您将使用 xargs 来调用它,如

find . -type f -name '*.txt' | xargs rm

rm 作为简单的字符串参数传递给 xargs,稍后由 xargs 调用,而无需 shell 的别名替换。 您的别名可能在 ~/.bashrc 中定义,以防您想删除它。


26
投票

您可以使用这个简单的命令来解决您的问题

find . -type f -name '*.txt' -delete

2
投票

根据您的 xargs 版本,您可能可以使用 --no-run-if-empty GNU 扩展选项:

find . -type f -name '*.txt' | xargs  --no-run-if-empty  rm -rf

0
投票
ls "fnames with wild chars" | xargs -I{} rm -v {}

这里

-I{}
用于替换所有替换为
{}
的输入。

注意:使用带有不正确通配符的名称可能会造成灾难性的后果,因为删除的文件将无法检索。谨慎使用它并尽量避免使用递归(-r)标志。


-1
投票

您想要将 PATH_DIR2 中的现有文件删除到 PATH_DIR1 中:

find PATH_DIR1 -type f  -exec basename '{}' ';' | xargs printf -- 'PATH_DIR2/%s\n' | xargs rm

说明:

  1. 列出 PATH_DIR1 中的所有文件名

查找 PATH_DIR1 -type f -exec basename '{}' ';'

  1. 使用 PATH_DIR2 中的现有文件过滤先前的列表(查找相交数据)

xargs printf -- 'PATH_DIR2/%s '

  1. 对过滤结果执行删除操作

xargs rm

© www.soinside.com 2019 - 2024. All rights reserved.