如何删除定位返回的所有文件

the*_*cer 15 command-line pipe

目前他就是我所做的:

第1步:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar
Run Code Online (Sandbox Code Playgroud)

第2步:

通过复制粘贴每一行来手动执行删除。

rm /home/abc/fooBar
rm /home/abc/Music/fooBar

我如何一步做到这一点?就像是

找到 fooBar > rm

谢谢。

fin*_*ley 15

正如其他人已经提到的, xargs 是你的朋友。这是一个非常强大的工具,我将尝试解释它并为常见问题提供解决方法。

xargs 所做的是从输入中取出一行,并将其附加到另一个命令,对输入中的每一行执行该另一个命令。因此,通过打字locate foobar | xargs rm -f,所述定位命令的输出将被贴在所述端的的rm -f命令,并用于通过产生每一行执行的locate foobar

问题:

但是如果 locate 返回的行中有空格怎么办?这将破坏rm -f命令,因为传递给 rm 的参数需要是文件(除非您使用 -r 开关),并且如果文件路径包含空格,则需要对其进行转义或引用。

xargs 提供了 -i 开关,用于将输入替换到后面的命令中,而不仅仅是附加它。所以我将建议更改为

locate foobar | xargs -ixxx rm -f 'xxx'
Run Code Online (Sandbox Code Playgroud)

现在只有当 locate 返回的文件名包含撇号时才会中断。

我必须同意 qbi,你应该小心使用 rm -f!对 xargs 使用 -p 标志,或者在将它提供给 xargs 之前单独运行 locate foobar,或者从 rm 中删除 -f。

locate foobar | xargs -p -ixxx rm -f 'xxx'
Run Code Online (Sandbox Code Playgroud)

  • 为了对名称中带有异国情调字符(换行符、引号、撇号等)的文件具有鲁棒性,您可以使用 `-0` (`--null`) 选项来定位和 xargs。这使用安全的 ASCII NUL 字符来分隔文件名:`locate -0 foobar | xargs -0 rm` (9认同)

qbi*_*qbi 8

您可能需要更多选项才能与xargs. 先用xargs -p. 如果没问题,去掉这个-p选项:

locate foobar | xargs rm
Run Code Online (Sandbox Code Playgroud)


kar*_*k87 6

要删除 locate 返回的所有文件,请在终端中发出以下命令

locate foobar | xargs rm -f