删除包后,其中一些留下的文件后面,我没有真正使用,所以我想删除它们而不是从头开始恢复整个服务器。从定位获取文件,然后删除它们
我用
sudo locate logstash
我得到的文件和目录的一个长长的清单,我想将其删除。
有一种老式的方式,我见过,这是把这个列表到一个file.txt,然后逐行阅读并将其删除。
有没有更快的bash方式来删除这个列表中显示的这些项目?
另外,如何判断它是目录还是文件? (简单或递归删除)
删除包后,其中一些留下的文件后面,我没有真正使用,所以我想删除它们而不是从头开始恢复整个服务器。从定位获取文件,然后删除它们
我用
sudo locate logstash
我得到的文件和目录的一个长长的清单,我想将其删除。
有一种老式的方式,我见过,这是把这个列表到一个file.txt,然后逐行阅读并将其删除。
有没有更快的bash方式来删除这个列表中显示的这些项目?
另外,如何判断它是目录还是文件? (简单或递归删除)
你可以试试这个:
locate logstash | xargs -I{} rm -rf {}
注: 确保locate
给你,你要删除的有效文件。
最好是安全比遗憾:
#!/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
选项可供输出。
我会提示''y/N]'来表明任何不匹配'y'的东西都被认为是'n' - 这是交互式程序的一个常见约定。 –
谢谢@TobySpeight,因为在区分大小写? – hmedia1
不,约定是以大写形式写入默认值,但接受这两种情况。然后一些脚本在[YY] *)中使用'case“$ REPLY”true ;;; *) 出口 ;;例如,“esac”。 –
这个答案假定使用GNU coreutils。这里介绍的一些选项是POSIX标准的GNU扩展,在其他实现中不存在。
xargs
是将标准输入转换为程序参数的工具。
为了安全地使用它,你要调用locate
与-0
产生空分隔的输出,并xargs
也-0
了解空分开输入。这允许你的文件名包含任何空格(包括换行符)而没有问题。
我们也将通过-r
到xargs的,所以我们不跑rm
如果没有匹配
虽然locate
总是输出绝对路径,这是一个好习惯,从--
论点明确不同的选项,所以以避免名称以-
开头的意外。
我还会考虑使用-I
选项来rm
,要求确认要删除的文件,如果有三个以上的参数,或者如果有的话是一个目录。
随着所考虑的所有,你
locate -0 logstash | xargs -r0 rm -Ir --
个人而言,我想补充-i参数只是为了安全起见。找到logstash | xargs rm -rfI – SpaceCowboy
@SpaceCowboy不错的一个,我也会用它! –