【问题标题】:Delete a list of files with find and grep使用 find 和 grep 删除文件列表
【发布时间】:2014-01-18 11:01:20
【问题描述】:

我想删除所有名称中包含特定单词的文件,例如“车”。 到目前为止,我想出了这个:

find|grep car

如何将输出传递给 rm?

【问题讨论】:

    标签: grep find pipe rm


    【解决方案1】:
    find . -name '*car*' -exec rm -f {} \;
    

    或将管道的输出传递给xargs

    find | grep car | xargs rm -f
    

    请注意,这些是非常生硬的工具,您可能会删除您不打算删除的文件。此外,这里不努力处理包含诸如空格(包括换行符)或前导破折号等字符的文件。被警告。

    【讨论】:

    • 甚至可能是find . -name '*car*' -delete
    • +1。但是在前几次运行中:将“rm”更改为“echo rm”...并验证它只输出您真正想要删除的文件,而没有其他文件^^
    • @nhahtdh: xargs: illegal option -- d;全世界都不是Linux。那么名称中包含\n 的目录呢?如果你担心空格,你应该使用find --print0 ... xargs -0
    • alias cleandesktop="find ~/Desktop/ -name '*Screen Shot*' -exec rm -f {} \;" 繁荣。是的。
    • 请注意,如果您的文件包含不寻常的字符(如空格)或以破折号开头,这将不起作用。请参阅my answer 进行修复。
    【解决方案2】:
    find start_dir -iname \*car\* -exec rm -v {} \;
    

    【讨论】:

      【解决方案3】:

      要先查看要删除的内容,因为rm -fr 是一个危险的命令:

      find /path/to/file/ | grep car | xargs ls -lh
      

      然后,如果结果是您想要的,则通过删除 ls -lh 运行实际命令,将其替换为 rm -fr

      find /path/to/file/ | grep car | xargs rm -fr
      

      【讨论】:

      • 惊人的解决方案!谢谢!
      【解决方案4】:

      我喜欢用

      rm -rf $(find . | grep car)

      它完全按照您的要求运行,在 grep carfind . 的输出返回的内容上运行 rm -rf,这是递归每个文件和文件夹的列表。

      【讨论】:

        【解决方案5】:

        有点死灵法,但你也可以使用 find、grep 和 xargs

        find . -type f | grep -e "pattern1" -e "pattern2" | xargs rm -rf
        

        ^ Find 需要一些注意才能使其潜在地满足您的需求,例如文件、最小深度、最大深度和任何通配符。

        【讨论】:

          【解决方案6】:

          您确实想将find-print0rm-- 一起使用:

          find [dir] [options] -print0 | grep --null-data [pattern] | xargs -0 rm --
          

          一个具体的例子(删除当前目录下所有文件名中包含汽车的文件):

          find . -print0 | grep --null-data car | xargs -0 rm --
          

          为什么需要这样做:

          • -print0--null-data-0 将输入/输出的处理从解析为由空格分隔的标记更改为解析为由\0 字符分隔的标记。这允许处理不寻常的文件名(有关详细信息,请参阅man find
          • rm -- 确保实际删除以- 开头的文件,而不是将它们视为rm 的参数。如果有一个名为-rf 的文件并执行find . -print0 | grep --null-data r | xargs -0 rm,则文件-rf 可能不会被删除,但会改变rm 在其他文件上的行为。

          【讨论】:

          • 在 MacOS 上,--null-data 是一个“无法识别的选项”。 --null 会是 grep 的等效选项吗?
          • @SteveS for mac 有一个更简单的方法:apple.stackexchange.com/questions/120399/…(我可以弄清楚如何使用grep和@ 987654342@,很遗憾)
          【解决方案7】:

          这会找到一个具有匹配模式 (*.xml) 的文件,并 grep 其内容以查找匹配的字符串 (exclude="1"),如果找到匹配项,则删除该文件。

          find . -type f -name "*.xml" -exec grep exclude=\"1\" {} \; -exec rm {} \;
          

          【讨论】:

            【解决方案8】:

            您可以使用 ls 和 grep 查找您的文件并使用 rm -rf 删除文件。

            rm -rf $(ls | grep car)
            

            但是,如果您不想删除的目录或文件的名称与您使用 grep 指定的字符模式相同,则使用此命令不是一个好主意。

            【讨论】:

              【解决方案9】:

              find | grep car | xargs rm -f得到结果时:

              /path/to/car  
              /path/to/car copy  
              

              一些包含空格的文件不会被删除。

              所以我的答案是:

              find | grep car | while read -r line ; do 
                rm -rf "${line}"
              done
              

              因此可以删除包含空格的文件。

              【讨论】:

                【解决方案10】:

                使用 rm 和通配符 * rm * 将删除所有文件 rm *.ext 将删除所有以 ext 作为扩展名的文件 rm word* 将删除所有以word开头的文件。

                【讨论】:

                  【解决方案11】:

                  这里介绍的大多数其他解决方案在处理包含空格的文件名时都存在问题。这是一个正确处理空格的解决方案。

                  grep -lRZ car . | xargs -0 rm
                  

                  使用的参数注意事项:

                  • -l 告诉 grep 只打印文件名
                  • -R 启用 grep 在子文件夹中递归搜索
                  • -Z 告诉 grep\0 而不是 \n 分隔结果
                  • -0 告诉 xargs\0 分隔输入参数,而不是空格
                  • car 是要搜索的正则表达式
                  • . 是要搜索的文件夹

                  也可以使用rm -f 强制删除(像往常一样)。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2014-09-19
                    • 2016-08-22
                    • 2013-08-20
                    • 2018-12-28
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多