如何轻松删除路径列表中的文件?

如何轻松删除路径列表中的文件?

我有如下列表

/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。

相关内容