我有如下列表
/usr/lib/i386-linux-gnu/libavfilter.so
/usr/lib/i386-linux-gnu/libavfilter.so.3
/usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
/usr/local/lib/libavfilter.so
/usr/local/lib/libavfilter.so.4
/usr/local/lib/libavfilter.so.4.4.100
我怎样才能完全删除这些文件而不是像
rm /usr/lib/i386-linux-gnu/libavfilter.so
rm /usr/lib/i386-linux-gnu/libavfilter.so.3
rm /usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
rm /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
rm /usr/local/lib/libavfilter.so
rm /usr/local/lib/libavfilter.so.4
rm /usr/local/lib/libavfilter.so.4.4.100
?
警告! 在没有首先检查输出的情况下,不要应用以下命令
答案1
您的输入是什么?文件?命令?无论哪种方式,xargs
都应该有帮助:
cat file | xargs rm
... 将删除文件中每一行的每个路径。如果它只是一个在每一行上输出路径的命令,则通过 xargs 管道传输它,它应该可以正常工作。
或者,使用xargs --arg-file="file.txt" rm
。这节省了管道和不必要的猫。
如果您希望对每一行执行更多操作,可以使用传统的 bash while 循环:
# uses echo for testing
# remove # before rm for actual deletion
while read -r path; do
echo "deleting $path"
# rm "$path"
done < file
如果您的列表是 的输出find
,您还有其他几个选项,包括-delete
选项或使用-exec rm {} \+
。几乎肯定还有几十种其他可行的成功途径。如果您使用 find 进行自动删除,请在删除之前检查输出。它不会原谅你的错误。
在将内容输入到 时,空格可能会造成问题xargs
。这对你和你的locate来说可能不是问题,但两者locate
都有xargs
办法解决这个问题。它们都可以选择使用\0
空字符作为分隔符,而不是回车符。是的。简而言之,你的命令变成:
locate -0b libavfilter.so | xargs -0 rm
答案2
你可以将文件放在一起,中间用空格隔开。像这样:
rm /usr/lib/i386-linux-gnu/libavfilter.so /usr/lib/i386-linux-gnu/libavfilter.so.3 /usr/lib/i386-linux-gnu/libavfilter.so.3.42.103 /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3 /usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103 /usr/local/lib/libavfilter.so /usr/local/lib/libavfilter.so.4 /usr/local/lib/libavfilter.so.4.4.100
答案3
将输出传输至xargs
:
echo "/usr/lib/i386-linux-gnu/libavfilter.so
/usr/lib/i386-linux-gnu/libavfilter.so.3
/usr/lib/i386-linux-gnu/libavfilter.so.3.42.103
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3
/usr/lib/i386-linux-gnu/i686/cmov/libavfilter.so.3.42.103
/usr/local/lib/libavfilter.so
/usr/local/lib/libavfilter.so.4
/usr/local/lib/libavfilter.so.4.4.100" | xargs rm
或者如果你的列表在文件中:
cat file | xargs rm
答案4
最简单的方法是
cat list.txt | xargs -P 3 rm
虽然你不能使用 -P,默认情况下它会运行尽可能多的任务,但如果你的列表很大,这可能会成为问题。请参阅男人页面以获取进一步的解释。
这样做的一个缺点是,如果您的文件名称中有空格,则此操作将失败。如果不是这种情况,您可以直接使用,但如果文件名称中有您期望的空格,则请确保将分隔符指定为换行符。
cat list.txt | xargs -d '\n' -P 3 rm
在 Mac OS 上,这将产生错误,但您不是在 Mac OS 上,因此您可以使用它。
注意:由于这可能会导致数据/配置丢失或安装失败,因此始终建议您在实际删除文件之前先使用列表。使用 ls,如果文件按预期正确列出,则更改为 rm。