意外将文件复制到错误的目录

意外将文件复制到错误的目录

几年前,我将所有文件从/usr/local/bin复制到了/bin

现在我的/bin目录中堆满了不需要的文件。如何使用命令删除它们,find而无需安装第三方软件包?

笔记:涉及第三方软件包的答案可能会对有同样问题的其他人有所帮助。

答案1

将 Stack Exchange 中提供的解决方案拼凑在一起。

如果你做了足够的研究,你就会通过结合以下五个答案找到解决方案:

试运行

首先运行不带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')

相关内容