【问题标题】:Remove all files contain specific string - Bash删除所有包含特定字符串的文件 - Bash
【发布时间】:2020-07-27 04:08:58
【问题描述】:

我有这些坏数据

AWS-Console.pngcrop-AWS-Console.png                                                                                    
Alimofire.pngcrop-Alimofire.png                                                                                        
Amazon-ECR-.pngcrop-Amazon-ECR-.png                                                                                    
Amazon-ECS.pngcrop-Amazon-ECS.png                                                                                      
Amazon-RDS.pngcrop-Amazon-RDS.png                                                                                      
Angular.pngcrop-Angular.png                                                                                            
AngularJS.pngcrop-AngularJS.png 
.... 1000 more

我正在尝试删除它们

我试过了

ls public/assets/fe/img/skill/ | grep crop | rm -rf *crop*
ls public/assets/fe/img/skill/ | grep crop | rm -rf
rm -rf $(ls public/assets/fe/img/skill/ | grep crop)

它们都不起作用......

【问题讨论】:

  • 有几个;一个简单的谷歌应该可以工作。 rm *crop*find -type f -name '*crop*' -delete
  • for f in *.png; do if [[ $f == *crop* ]]; then echo rm -- "$f"; fi; done
  • rm 命令中不是缺少路径吗?
  • find . -type f -name '*crop*.png' ....

标签: linux bash rm


【解决方案1】:

如果文件非常多(显然不是你的情况),xargs 可以speed up the process。这适用于您可能希望从管道中读取的许多内容。

 find . -name "*crop*" -type f | xargs rm

在这里使用find 的主要优点是它是一种忽略目录的简单方法。如果这不是问题,让操作系统处理所有这些。

printf "%s\n" public/assets/fe/img/skill/*crop* | xargs rm

如果您需要能够在 子目录中提取文件 -

shopt -s globstar # double asterisks not include arbitrary preceding paths
printf "%s\n" public/assets/fe/img/skill/**crop* | xargs rm

不过,您可能需要先查看列表。

printf "%s\n" public/assets/fe/img/skill/*crop* >crop.lst 
# check the list - vi, grep, whatever satisfies you.
xargs rm < crop.lst  # fast-delete them in bulk 

【讨论】:

    【解决方案2】:

    您的命令中的主要问题是ls 命令的输出中缺少路径。

    ls public/assets/fe/img/skill/ | grep crop 将返回,例如AWS-Console.pngcrop-AWS-Console.png 传递给 rm。但是rm AWS-Console.pngcrop-AWS-Console.png 失败了,因为当前目录中没有这样的文件。它应该是rm public/assets/fe/img/skill/AWS-Console.pngcrop-AWS-Console.png

    -d 添加到ls 命令应该可以解决问题:

    ls -d public/assets/fe/img/skill/ | grep crop | rm -rf
    rm -rf $(ls -d public/assets/fe/img/skill/ | grep crop)
    

    正如其他答案所指出的,存在其他解决方案,包括:

    rm public/assets/fe/img/skill/*crop*
    find public/assets/fe/img/skill/ -name "*crop*" -type f -exec rm -i {} \;
    

    【讨论】:

      【解决方案3】:

      改用find 命令

      find . -name "*crop*" -type f -exec rm -i {} \;
      
      • -type f 将指定仅搜索文件并避免目录
      • -exec 要求命令输入以\; 结尾,{} 被命令的结果替换
      • -i 会要求您确认;确定您的操作后将其删除。
      • advice 预先用-print 代替-exec ... 显示结果

          find . -name "*crop*" -type f -print
        

      更多here您的问题将在其中找到更准确的答案

      【讨论】:

        【解决方案4】:

        rm 可以处理 ls 处理的 glob 表达式:

        rm public/assets/fe/img/skill/*crop*
        

        【讨论】:

        • 什么......这太酷了,我不敢相信我忘记了,我很接近。
        • 这是一个很好的答案,直到找到arg_max
        • arg_max 是什么?
        • in-ulm.de/~mascheck/various/argmax 仅适用于大量文件,在您的情况下似乎无关紧要。
        猜你喜欢
        • 1970-01-01
        • 2011-09-05
        • 2012-07-02
        • 2014-10-20
        • 2013-08-19
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多