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

ken*_*enn 10 rm removing

我有一个像

/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
Run Code Online (Sandbox Code Playgroud)

我怎样才能完全删除这些文件,而不是像这样一一删除它们

 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
Run Code Online (Sandbox Code Playgroud)

?

警告! 不要在没有首先检查输出的情况下应用以下命令

Oli*_*Oli 16

你的输入是什么?一份文件?命令?无论哪种方式,xargs都应该有帮助:

cat file | xargs rm
Run Code Online (Sandbox Code Playgroud)

... 将删除文件中每一行的每个路径。如果它只是一个在每一行上输出路径的命令,请将其通过 xargs 进行管道传输,它应该可以正常工作。

或者,使用xargs --arg-file="file.txt" rm. 这节省了管道和不必要的 cat

如果您希望对每一行做更多的事情,您可以使用传统的 bash while 循环:

# uses echo for testing
# remove # before rm for actual deletion
while read -r path; do
    echo "deleting $path"
    # rm "$path"
done < file
Run Code Online (Sandbox Code Playgroud)

如果您的列表是 的输出find,您还有另外几个选项,包括一个-delete选项或使用-exec rm {} \+. 几乎可以肯定还有几十条其他可行的成功途径。如果您使用 find 进行自动删除,只需在删除前检查输出即可。它不会原谅你的错误。

空间可能会成为管道问题到xargs. 这对您和您所在的位置可能不是问题,但两者都有,locate并且xargs有办法解决这个问题。他们都可以选择使用\0空字符作为分隔符而不是返回行。好极了。简而言之,您的命令变为:

locate -0b libavfilter.so | xargs -0 rm
Run Code Online (Sandbox Code Playgroud)