如何删除由locate返回的所有文件

如何删除由locate返回的所有文件

目前我的工作如下:

步骤1:

locate fooBar
/home/abc/fooBar
/home/abc/Music/fooBar

第2步:

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

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

我该如何一步完成此操作?例如

定位 fooBar > rm

谢谢。

答案1

正如其他几位小伙伴已经提到的,xargs 是你的好朋友。它是一款非常强大的工具,我将尝试解释它,并为常见的问题提供解决方法。

xargs 的作用是从输入中取出一行,并将其附加到另一个命令,对输入中的每一行执行该命令。因此,通过输入locate foobar | xargs rm -f,locate 命令的输出将是修补到末端命令rm -f,并对 生成的每一行执行locate foobar

问题:

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

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

locate foobar | xargs -ixxx rm -f 'xxx'

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

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

locate foobar | xargs -p -ixxx rm -f 'xxx'

答案2

您可能需要更多选项才能与 一起使用xargs。请先使用 进行测试xargs -p。如果可以,请删除该-p选项:

locate foobar | xargs rm

答案3

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

locate foobar | xargs rm -f

答案4

一个不太简洁的替代方案是使用环形命令替换

for file in $(locate foobar); do rm "$file"; done

$(locate foobar)位使用的输出locate foobar,然后for循环允许您在其每一行上运行某些操作。周围的引号$file应允许它处理文件名中的空格。

虽然xargs更简洁,但是如果您想扩展逻辑,例如在循环内运行多个命令,循环可能更适合。

正如其他人所建议的那样,要么locate foofar先运行,要么添加-i选项以rm避免做一些非常糟糕的事情并删除你不想删除的文件

相关内容