3

我想删除文件夹中的多余文件。就像是

cat_1.jpg
cat_2.jpg
cat_3.jpg
dog_10.jpg
dog_100.jpg

减少到

cat_3.jpg
dog_100.jpg

即只取每个后缀最大的文件的版本,删除其余的。

这很像

列出具有最小序列的文件

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

编辑:

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

4

1 回答 1

2

假设您的文件名始终采用 form <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>

请注意,find使用它代替,ls *.jpg以便我们可以更好地处理大量文件。


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

于 2012-09-10T14:51:19.617 回答