Win*_*nix 6 command-line sudo rm find
几年前,我从复制所有文件/usr/local/bin
到/bin
。
现在我的/bin
目录中堆满了不需要的文件。如何使用find
命令删除它们而无需安装第三方软件包?
注意:涉及第三方软件包的答案可能对有相同问题的其他人有所帮助。
如果您进行足够的研究,您将通过结合以下五个答案找到解决方案:
首先运行不带rm
(remove) 选项的命令以确保找到正确的文件:
$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}'
/bin/.auto-brightness-config
/bin/auto-brightness-config
/bin/bell
/bin/bell/bell-select-menu
( ... OUTPUT SHORTENED ... )
Run Code Online (Sandbox Code Playgroud)
find
返回目录 1 ( /usr/local/bin
) 后跟目录 2 ( /bin
(:
sort
按字母顺序对两个目录的文件名进行排序
uniq -d
仅报告重复项
这为我们提供了意外复制到目录 2 的目录 1 文件名列表。但列表顶部有一个空行。
tail -n +2
删除了列表顶部的空行。
awk '{print "/bin/" $0}'
预先添加/bin/
到每个文件名,所以我们有:
rm
命令附加到管道现在我们已经确认输出是正确的,rm
通过xargs
. 请注意,如果您的文件名带有特殊字符,请阅读上面的第四个链接以进行特殊处理。
$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | xargs rm -f
rm: cannot remove '/bin/.auto-brightness-config': Permission denied
rm: cannot remove '/bin/auto-brightness-config': Permission denied
rm: cannot remove '/bin/bell': Is a directory
rm: cannot remove '/bin/bell/bell-select-menu': Permission denied
Run Code Online (Sandbox Code Playgroud)
在Permission denied
出现错误的原因,我们必须用sudo
权力运行的命令。注意错误'/bin/bell' is a directory
。稍后我们将不得不使用rm -d
命令手动删除目录。
sudo
/bin
目录所需的权力。发生权限被拒绝错误的原因是因为root
拥有/bin
我们要删除的文件,而我们的常规用户 ID 不允许删除它们。
请注意,根据您将文件复制到目标目录的方式,您可能不需要sudo
删除它们的权限。例如,如果您被定义为目标目录中文件的所有者。
现在让我们以sudo
权力运行命令:
$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | sudo xargs rm -f
rm: cannot remove '/bin/bell': Is a directory
rm: cannot remove '/bin/bell/sounds': Is a directory
rm: cannot remove '/bin/startup-scripts': Is a directory
rm: cannot remove '/bin/zap': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/BeOS': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/FreeBSD': Is a directory
rm: cannot remove '/bin/zap/Assembly-Intro-hello/Linux': Is a directory
Run Code Online (Sandbox Code Playgroud)
已删除 75 个文件,但仍有 8 个空子目录需要删除。我们使用-r
递归选项和rm
命令来删除它们:
$ find /usr/local/bin/ /bin/ -printf '%P\n' | sort | uniq -d | tail -n +2 | awk '{print "/bin/" $0}' | sudo xargs rm -rf
Run Code Online (Sandbox Code Playgroud)
什么都没有报告,所以没有更多的错误!
这个答案的目的不仅是解决手头的问题,而且向读者展示如何通过检查 Stack Exchange 中的多个现有答案来解决问题。