我正在编写一个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
选项。 它删除文件没有错误与特殊字符…