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
我通常发现使用-exec
for 选项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 文件可能有它们,但您应该能够控制日志文件的名称。
您可以告诉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
.