【问题标题】:How do you recursively delete all hidden files in a directory on UNIX?如何递归删除 UNIX 目录中的所有隐藏文件?
【发布时间】:2011-07-01 00:06:02
【问题描述】:

我一直在寻找一段时间,但似乎无法得到一个简洁的解决方案。我有一台 Mac,其中有一个文件夹,我想清除所有隐藏的文件/目录 - 任何隐藏的东西。它曾经是一个包含大量 .metadata/.svn 内容的 Eclipse 工作区,我对所有这些都被删除没意见。我该如何做到这一点(使用 shell 脚本、Applescript 等)。提前非常感谢!

【问题讨论】:

    标签: macos shell unix


    【解决方案1】:

    find . -name ".*" -print

    我不知道 MAC 操作系统,但这是您在大多数 *nix 环境中找到它们的方式。

    find . -name ".*" -exec rm -rf {} \;

    要删除它们...首先查找并确保该列表是您想要的,然后再将它们全部删除

    第一个"." 表示来自您的当前目录。另请注意,第二个".*" 可以更改为".svn*" 或任何其他更具体的名称;上面的语法只查找所有隐藏文件,但您可以更有选择性。我一直使用它来删除旧代码中的所有 .svn 目录。

    【讨论】:

    • 这将尝试删除当前目录(名为.)。
    • 20:53:27:jmquigley@shire:samples(master): ~/tmp ~>find . -name ".*" -exec rm -rf {} \; rm:无法删除目录:`.'好点(但它不会删除它,但会标记它)。我给出了“.svn*”选项,不过这是一个更好的选择。 (我讨厌编辑,哈哈,我猜无法格式化这些)。
    • find . -name ".*.*" -print 将查找文件名中至少包含一个点的任何文件。
    • 在 mac (10.4) 上,第二个命令应以“\;”结尾而不是“/;”
    • @jmq 我认为您的意思是使用反斜杠而不是前斜杠:\;
    【解决方案2】:

    您需要非常小心并测试您使用的任何命令,因为您可能不想删除当前目录 (.)、父目录 (..) 或所有文件。

    这应该只包括以点开头的文件和目录,不包括...

    find . -mindepth 1 -name '.*' -delete
    

    【讨论】:

      【解决方案3】:
      rm -rf `find . -type f -regex '.*/\.+.+'`
      

      如果要删除目录,请将-type f 更改为-type d

      如果你想删除文件和目录删除-type f

      【讨论】:

      • 这对于包含空格的文件名失败。
      • @Pauseduntilfurthernotice。我不明白为什么。它在哪个系统上失败了?
      【解决方案4】:
      find /path -iname ".*" -type f -delete ;
      

      Ruby(1.9+)

      ruby -rfileutils -e 'Dir["**/.*"].each{|x| FileUtils.rm(x) if File.file?(x)}'
      

      【讨论】:

      • 这很容易通过在find 命令中指定-type d 来实现
      • -iname 在你不需要的时候可能会慢一点。如果包含-type d 和以. 开头的名称,它可能会尝试删除名为. 的当前目录。
      【解决方案5】:

      我使用这个命令来删除空目录。它从底部开始,一直到顶部。因此,如果您引用当前路径,它不会失败。

      find . -depth -type d -empty -exec rmdir {} \;
      

      【讨论】:

        【解决方案6】:

        我发现它运行良好(至少在 Linux 上的 Bash 中):

        find . -wholename '*/.*' -type f | sed -n '/\/\.[^\/]\+$/p' | xargs rm
        

        您可以根据自己的喜好调整sed 调用中的正则表达式。

        不过要小心:就我而言,我有很多名为 .gitignore.gitkeep 的隐藏文件必须保留。请务必检查列表,看看是否有您想要保留的内容。

        我发现这个变体非常有用,它会删除像 ._ANYTHING 这样的文件(通常是垃圾文件或 tmp 文件):

        find . -wholename '*/.*' -type f | sed -n '/\/\._[^\/]\+$/p' | xargs rm
        

        【讨论】:

          猜你喜欢
          • 2014-12-13
          • 2012-03-05
          • 2011-12-31
          • 1970-01-01
          • 1970-01-01
          • 2013-08-05
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          相关资源
          最近更新 更多