【问题标题】:Grouping files based on their filename and keeping only one out of the group?根据文件名对文件进行分组并只保留一个文件?
【发布时间】:2014-02-10 20:55:53
【问题描述】:

我在几个文件夹中有一堆文件,名称格式为 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 脚本,但现在语法有点过头了。谁能帮帮我?

【问题讨论】:

  • 我看不到你想要的的连接,并删除1000_5002_033.jpg,因为它是具有最低NumC的唯一NumA_NumB?
  • 这是一个错字 - 感谢您的发现

标签: regex bash recursion grouping filenames


【解决方案1】:

使用排序 + 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]++'

【讨论】:

  • 感谢您告诉我。如果此答案解决了您的问题,您需要投票或接受它。
【解决方案2】:
find . -type f -name '*_*_*.jpg' -printf "%f %p\n" | 
awk '{split($1, a, "_"); if (seen[a[1],a[2]]++ == 0) {$1=""; print}}' | 
xargs echo rm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 1970-01-01
    • 2023-03-10
    • 2019-07-21
    • 2012-07-07
    • 2016-04-08
    相关资源
    最近更新 更多