如何使用 find 命令删除符合模式的文件?

如何使用 find 命令删除符合模式的文件?

我正在尝试编写一个 bash 命令,它将删除所有与特定模式匹配的文件 - 在本例中,它是所有已建立的旧 vmware 日志文件。

我尝试过这个命令:

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

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

答案1

我通常发现使用-exec选项find更简单,也更不容易混淆。试试这个:

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

之后的所有内容-exec都被视为针对每个结果运行的命令,直到;,它在这里被转义,以便将其传递给find。被替换为通常会打印的{}文件名。find

一旦您确认它可以实现您想要的功能,您就可以删除-i

答案2

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

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

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

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

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

答案3

您可以告诉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在单引号中的来转义 ,否则您的 shell 可能会在将其传递给 之前尝试扩展它find

答案4

不要忘记 find 的-delete选项。它会删除带有特殊字符的文件,并且不会出错...

相关内容