删除所有包含特定字符串的文件 - Bash

Remove all files contain specific string - Bash

我有这些坏数据

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)

None 他们工作......

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

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

改用find命令

find . -name "*crop*" -type f -exec rm -i {} \;
  • -type f 将指定仅搜索文件并避免目录
  • -exec要求命令输入以\;结尾,{}被命令的结果
  • 替代
  • -i 会要求您确认;一旦确定要做什么,请将其删除。
  • advice-print 代替 -exec ...

    预先显示结果
      find . -name "*crop*" -type f -print
    

更多 here 您的问题会在哪里找到更准确的答案

您的命令中的主要问题是 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 {} \;

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

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

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

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