根据文件名对文件进行分组,并且只保留组中的一个



我在几个文件夹中有一堆文件,名称格式为NumA_NumB_NumC.jpg(例如:1000_5000_001.jpg)。每个NumA都有一个或多个NumB。每一个NumB都有几个NumC。对于每个NumA_NumB组,我只想保持最低的NumC。

例如:

  • 1000_5000_001.jpg<-保持
  • 1000_5000_002.jpg<-删除
  • 1000_5000_003.jpg<-删除
  • 1000_5001_032.jpg<-保持
  • 1000_5001_033.jpg<-删除

(注意:NumB数字没有规律性,除了每组中最低的一个是要保留的那个)

最好的方法是什么?我在想用正则表达式编写linux shell脚本,但语法现在有点让我难以理解。有人能帮我吗?

使用sort+awk

ls *.jpg|sort -t_ -k1.1n -k2.2n -k3.3n |awk -F _ '!a[$1 FS $2]++'
1000_5000_001.jpg
1000_5001_032.jpg

如果您的排序命令具有-V选项

-V, --version-sort
natural sort of (version) numbers within text

你可以有一个更短的:

ls *.jpg|sort -V  |awk -F _ '!a[$1 FS $2]++'
find . -type f -name '*_*_*.jpg' -printf "%f %pn" | 
awk '{split($1, a, "_"); if (seen[a[1],a[2]]++ == 0) {$1=""; print}}' | 
xargs echo rm

相关内容

  • 没有找到相关文章

最新更新