从locate获取文件,然后删除它们

时间:2016-11-04 08:26:34

标签: linux bash

删除软件包之后,其中一些文件会留下我不会使用的文件,所以我想删除它们而不是从头开始恢复整个服务器。

我用

sudo locate logstash

我得到一长串文件和目录,我想删除它们。

我已经看过一种oldschool方式,并且将这个列表放到file.txt中,然后逐行读取并删除它。

是否有更快的bash方法来删除此列表中显示的这些项目?

另外,我怎么知道它是目录还是文件? (简单地删除或递归)

3 个答案:

答案 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的输入也使用空字符作为分隔符。如果说          例如,程序是GNU find-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 --