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

我正在编写一个bash命令,它将删除所有匹配特定模式的文件 – 在这种情况下,它是所有已经构build的vmware日志文件。

我试过这个命令:

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

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

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

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

执行完后的所有内容都被视为一个命令来运行每个结果,直到; ,这是在这里逃脱,所以它会被传递给find{}被replace为通常打印的文件名。

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

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

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

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

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

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

你可以告诉find用NULL来分隔输出列表,并且xargs接收它的input列表是一样的:

 $ 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单引号来转义vmware-*.log ,否则,您的shell可能会在将其传递给find之前尝试将其展开。

不要忘记find的-delete选项。 它删除文件没有错误与特殊字符…