如何使用find命令删除与模式匹配的文件?


17

我正在尝试编写bash命令,该命令将删除所有与特定模式匹配的文件-在这种情况下,这是所有已建立的旧vmware日志文件。

我已经尝试过以下命令:

find . -name vmware-*.log | xargs rm

但是,当我运行该命令时,它会阻塞名称中带有空格的所有文件夹。有没有一种格式化文件路径的方法,以便xargs将其传递给rm引用或正确转义?


Answers:


20

我通常会发现,使用该-exec选项find会更容易且不会造成混乱。尝试这个:

find . -name vmware-*.log -exec rm -i {} \;

之后,一切都-exec被认为是为每个结果运行命令,直到;,这是这里这么逃脱,它会被传递给find。将{}find通常会打印的文件名替换。

验证完成后,您可以删除-i


1
另外,如果只是要删除的文件而不是目录,则可以在find命令中添加“ -type f”。
JamesHannah,2009年

18

如果您拥有GNU find,则可以使用以下-delete选项:

find . -name "vmware-*.log" -delete

要使用xargs并避免文件名中的空格问题:

find . -name vmware-*.log -print0 | xargs -0 rm

但是,您的日志文件的名称中不应包含空格。文字处理文档和MP3文件可能包含它们,但是您应该能够控制日志文件的名称。


那很整齐。我对此一无所知。
杰夫·斯尼德

8

您可以告诉您find用NULL分隔输出列表,并xargs以相同的方式接收其输入列表:

$ ls -l "file 1" "file 2"
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 file 2

$ find . -name 'file *' -print0 | xargs -0 ls -l
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 1
-rw-r--r-- 1 james james 0 Oct 19 13:28 ./file 2

$ find . -name 'file *' -print0 | xargs -0 rm -v
removed `./file 2'
removed `./file 1'

另外,请确保*使用反斜杠或通过vmware-*.log在单引号中包含来转义,否则您的外壳可能会在将其传递给之前尝试对其进行扩展find


6

不要忘记查找的-delete选项。它将删除带有特殊字符的文件而没有错误...

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.