2016-11-04 87 views
1

删除包后,其中一些留下的文件后面,我没有真正使用,所以我想删除它们而不是从头开始恢复整个服务器。从定位获取文件,然后删除它们

我用

sudo locate logstash 

我得到的文件和目录的一个长长的清单,我想将其删除。

有一种老式的方式,我见过,这是把这个列表到一个file.txt,然后逐行阅读并将其删除。

有没有更快的bash方式来删除这个列表中显示的这些项目?

另外,如何判断它是目录还是文件? (简单或递归删除)

回答

3

你可以试试这个:

locate logstash | xargs -I{} rm -rf {} 

注: 确保locate给你,你要删除的有效文件。

+0

个人而言,我想补充-i参数只是为了安全起见。找到logstash | xargs rm -rfI – SpaceCowboy

+0

@SpaceCowboy不错的一个,我也会用它! –

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选项可供输出。

+1

我会提示''y/N]'来表明任何不匹配'y'的东西都被认为是'n' - 这是交互式程序的一个常见约定。 –

+0

谢谢@TobySpeight,因为在区分大小写? – hmedia1

+0

不,约定是以大写形式写入默认值,但接受这两种情况。然后一些脚本在[YY] *)中使用'case“$ REPLY”true ;;; *) 出口 ;;例如,“esac”。 –

0

这个答案假定使用GNU coreutils。这里介绍的一些选项是POSIX标准的GNU扩展,在其他实现中不存在。

xargs是将标准输入转换为程序参数的工具。

为了安全地使用它,你要调用locate-0产生空分隔的输出,并xargs-0了解空分开输入。这允许你的文件名包含任何空格(包括换行符)而没有问题。

我们也将通过-r到xargs的,所以我们不跑rm如果没有匹配

虽然locate总是输出绝对路径,这是一个好习惯,从--论点明确不同的选项,所以以避免名称以-开头的意外。

我还会考虑使用-I选项来rm,要求确认要删除的文件,如果有三个以上的参数,或者如果有的话是一个目录。

随着所考虑的所有,你

locate -0 logstash | xargs -r0 rm -Ir -- 
相关问题