删除所有包含特定字符串的文件 - 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
我有这些坏数据
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