几年前,我将所有文件从/usr/local/bin
复制到了/bin
。
现在我的/bin
目录中堆满了不需要的文件。如何使用命令删除它们,find
而无需安装第三方软件包?
笔记:涉及第三方软件包的答案可能会对有同样问题的其他人有所帮助。
答案1
将 Stack Exchange 中提供的解决方案拼凑在一起。
如果你做了足够的研究,你就会通过结合以下五个答案找到解决方案:
- 如何在 shell 脚本中比较两个目录中的文件名?
- 如何使用 bash/sed 脚本删除文本文件的第一行?
- 将字符串添加到每行前面的命令?
- 将 grep 输出给 rm
- 如果文件不存在,如何让 rm 不给出错误?
试运行
首先运行不带rm
(删除)选项的命令以确保找到正确的文件:
$ 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 ... )
怎么运行的
find
返回目录 1 ( ) 中的文件名,/usr/local/bin
后跟目录 2 ( /bin
(:
目录 1 文件无特定顺序
- bbbb
- 啊啊啊
- 年份
目录 2 文件无特定顺序
- 回声
- 啊啊啊
- 猫
- bbbb
- egrep
- 年份
sort
按字母顺序对两个目录的文件名进行排序
- 啊啊啊
- 啊啊啊
- bbbb
- bbbb
- 回声
- egrep
- 年份
- 年份
- 猫
uniq -d
仅报告重复项
- 啊啊啊
- bbbb
- 年份
这给出了我们意外复制到目录 2 的目录 1 文件名列表。但列表顶部有一个空白行。
tail -n +2
删除列表顶部的空白行。
awk '{print "/bin/" $0}'
添加/bin/
到每个文件名前面,因此我们有:
- /bin/aaaaa
- /bin/bbbbb
- /bin/yyyyy
将命令附加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
出现错误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
已删除 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
没有任何报告,因此不再有错误!
概括
这个答案的目的不仅是解决手头的问题,而且还向读者展示如何通过检查 Stack Exchange 中的多个现有答案来解决问题。
答案2
你的方法很棒,但是看上去太长了。
尽管转型Linux Mint 到 Ubuntu 我使用过如下命令:
sudo find /bin -type f -exec dpkg -S {} \; 2> ~/Desktop/not-in-apt.out
并且对于您的情况,我们将得到错误复制的文件列表~/Desktop/not-in-apt.out
。
然后,您可以查看文件并删除其中列出的文件。或者使用一些脚本进行删除。
为了完全确保所有剩余文件/bin
都是正常的,您可以通过结合以下内容重新安装dpkg -S /bin
它们apt-get install --reinstall
:
sudo apt-get install --reinstall $(dpkg -S /bin | sed 's|: /bin||' | sed 's/,//g')