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

Dan*_*ego 16 linux bash log-files find shell-scripting

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

我试过这个命令:

find . -name vmware-*.log | xargs rm
Run Code Online (Sandbox Code Playgroud)

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

Jef*_*der 19

我通常发现使用-execfor 选项find更容易,更容易混淆。尝试这个:

find . -name vmware-*.log -exec rm -i {} \;
Run Code Online (Sandbox Code Playgroud)

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

一旦你确认它做了你想要的,你可以删除-i.


Den*_*son 17

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

find . -name "vmware-*.log" -delete
Run Code Online (Sandbox Code Playgroud)

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

find . -name vmware-*.log -print0 | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)

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


Jam*_*ger 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'
Run Code Online (Sandbox Code Playgroud)

此外,请确保您*使用反斜杠或将 包含vmware-*.log在单引号中转义 ,否则您的外壳程序可能会在将其传递给find.


Dom*_*Dom 5

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