不小心将文件复制到错误的目录

Win*_*nix 6 command-line sudo rm find

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

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

注意:涉及第三方软件包的答案可能对有相同问题的其他人有所帮助。

Win*_*nix 8

将 Stack Exchange 中可用的解决方案拼凑在一起。

如果您进行足够的研究,您将通过结合以下五个答案找到解决方案:

试运行

首先运行不带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(:

目录 1 文件无特定顺序

  • bbbb
  • 啊啊啊
  • yyyyy

目录 2 文件无特定顺序

  • 回声
  • 啊啊啊
  • bbbb
  • 埃格雷普
  • yyyyy

sort 按字母顺序对两个目录的文件名进行排序

  • 啊啊啊
  • 啊啊啊
  • bbbb
  • bbbb
  • 回声
  • 埃格雷普
  • yyyyy
  • yyyyy

uniq -d 仅报告重复项

  • 啊啊啊
  • bbbb
  • yyyyy

这为我们提供了意外复制到目录 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
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 中的多个现有答案来解决问题。