使用find和xargs命令删除文件

28

当我做的时候

rm file.txt
或者
rm *.txt

由于我没有使用-f选项来执行rm命令,所以会提示我确认是否删除每个文件。

但是当我执行以下操作时:

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

文件被删除时没有确认。

这背后的逻辑是什么?有可能在某些文档中找到原因吗?我无法解释为什么会这样。


3
您所描述的行为是“rm -i”的行为。您的shell中是否设置了rm命令的别名?运行“alias rm”是否输出任何内容? - Harald Gliebe
1
alias rm 给出 rm -i 的输出,这就解释了它。谢谢 - Martin G
4个回答

30
你为rm命令设置了一个别名为'rm -i'。因此,如果你直接调用该命令,就会像这样:
rm file.txt

或者
rm *.txt

别名将被扩展。如果你像这样用xargs调用它

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

将rm作为简单的字符串参数传递给xargs,然后由xargs调用而不进行shell别名替换。 如果您想删除它,请查看~/.bashrc中可能定义的别名。


1
这依赖于文件名中的空格...小心。使用print0代替。https://dev59.com/QGMl5IYBdhLWcg3wkXpx#42119953 - Ray Foss
2
请勿使用此答案中的命令,因为它们不安全,可能会导致包含空格的文件名出错。请使用 find -exec 命令。 - Mihail H.
例如,如果你有两个文件(config file.txtconfig),那么 find . -type f -name '*.txt' | xargs rm 将会删除 config 文件但不会删除 config file.txt 文件。 - Mihail H.

23

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

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

2
不错,但有一个拼写错误,应该是-type而不是--type,否则这个解决方案对我很有效。 - Levon

2

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

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

2
我知道这个问题是关于Linux的,但如果你像我一样是Mac用户,这个选项是隐含的,不需要。 - Rafs

-1
你想要移除PATH_DIR2中已存在的文件到PATH_DIR1中。
find PATH_DIR1 -type f  -exec basename '{}' ';' | xargs printf -- 'PATH_DIR2/%s\n' | xargs rm

解释:

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

find PATH_DIR1 -type f -exec basename '{}' ';'

  1. 使用PATH_DIR2中的现有文件筛选前面的列表(找到交集数据)

xargs printf -- 'PATH_DIR2/%s\n'

  1. 对筛选结果执行删除操作

xargs rm


1
这种方法相比其他方法有什么优势吗?另外,你能解释一下这些命令吗? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接