只保留每个文件的一个版本(bash)

时间:2012-09-10 14:32:23

标签: bash

我想删除文件夹中的冗余文件。像

这样的东西
cat_1.jpg
cat_2.jpg
cat_3.jpg
dog_10.jpg
dog_100.jpg

缩减为

cat_3.jpg
dog_100.jpg

也就是说,只使用后缀最多的每个文件的版本并删除其余文件。

这非常像

list the files with minimum sequence

但bash的答案有一个“for ... in ...”。我有数千个文件名。

编辑:

文件名约定错误。可能还有其他下划线(例如cat_and_dog_100.jpg)。我需要它只取最后一个下划线后的数字。

1 个答案:

答案 0 :(得分:2)

假设您的文件名始终采用<name>_<numbers>.jpg格式,这是一个快速入侵:

while read filename; do
    prefix=${filename/%_*/}  # Get text before underscore
    if [ "$prev_prefix" != "$prefix" ]; then  # we see a new prefix
        echo "Keeping filename"
        prev_prefix=$prefix
    else  # same prefix
        echo "Deleting $filename"
        rm $filename
    fi
done < <(find . -maxdepth 1 -name "*.jpg"| sort -n -t'_' -k1,2)

这是如何运作的:

  1. 首先按*.jpg排序所有<name>个文件,然后按<numbers>排序。
    • 具有相同前缀的所有文件将与最高出现的<number>第一个
    • 组合在一起
  2. 遍历文件名列表并删除文件,除非找到新的<name>(应该是<number>最高的那个
  3. 请注意,find代替ls *.jpg,因此我们可以更好地处理大量文件。


    免责声明:这是处理文件和版本控制的一种相当脆弱的方式,不应作为长期解决方案采用。请注意问题上发表的评论。