删除软件包之后,其中一些文件会留下我不会使用的文件,所以我想删除它们而不是从头开始恢复整个服务器。
我用
sudo locate logstash
我得到一长串文件和目录,我想删除它们。
我已经看过一种oldschool方式,并且将这个列表放到file.txt中,然后逐行读取并删除它。
是否有更快的bash方法来删除此列表中显示的这些项目?
另外,我怎么知道它是目录还是文件? (简单地删除或递归)
答案 0 :(得分:3)
你可以试试这个:
locate logstash | xargs -I{} rm -rf {}
注意:的
确保locate
为您提供了要删除的有效文件。
答案 1 :(得分:2)
安全比抱歉更好:
#!/usr/bin/env bash
sudo locate -0 logstash >> /tmp/logstash # Null separated to tmp file
xargs -0 -I {} -n1 -P0 echo {} < /tmp/logstash # Print list to check
read -p "Do you want to DELETE these items (Y/N)?"
[ "$(echo $REPLY | tr [:upper:] [:lower:])" == "y" ] || exit # Verify
xargs -0 -I {} -n1 -P0 sudo rm -rf {} < /tmp/logstash # Same list to delete
使用xargs
和文件时,使用空分隔列表是一种很好的做法,如手册页(我的重点)所述:
因为Unix文件名可以包含空格和换行符,所以 默认 行为往往是有问题的;
xargs
错误地处理包含空格和/或换行符的文件名。在这些情况下就是这样 最好使用-0
选项,以防止出现此类问题。使用时 这个选项你需要确保产生的程序xargs
的输入也使用空字符作为分隔符。如果说 例如,程序是GNUfind
,-print0
选项为您执行此操作。
locate
具有相应输出的-0
选项。
答案 2 :(得分:0)
这个答案假定使用GNU coreutils。这里介绍的一些选项是POSIX标准的GNU扩展,在其他实现中不存在。
xargs
是将标准输入转换为程序参数的工具。
要安全地使用它,您需要使用locate
调用-0
以生成空值分隔的输出,并使用xargs
调用-0
以了解null - 分离输入。这允许您的文件名包含任何空格(包括换行符)而不会出现问题。
我们也会将-r
传递给xargs,因此如果没有匹配,我们就不会运行rm
尽管locate
始终输出绝对路径名,但明确将选项与--
的参数分开是一个好习惯,以避免名称以-
开头的意外。
我还会考虑使用-I
选项来rm
,如果有超过三个参数,或者如果有任何目录,则要求确认要删除的文件。
考虑到所有这些,你得到了
locate -0 logstash | xargs -r0 rm -Ir --