2012-09-10 41 views
3

我想删除文件夹中的多余文件。像仅保留每个文件的一个版本(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的答案是 “对... ...中”。我有成千上万的文件名。

编辑:

得到的文件名称惯例错误。可能还有其他下划线(例如cat_and_dog_100.jpg)。我需要它只在最后一个下划线后面加上数字。

+2

我会使用Perl脚本,侧步'bash'。 Python或Ruby可以用来代替。需要注意确保'fish_90.jpg'被移除并保留'fish_103.jpg'。 –

+4

将来,请考虑使用适当的版本控制软件,而不是编号的文件名。 – chepner

+0

文件名是否可预测,即始终为' _ .jpg'? –

回答

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>

注意find代替ls *.jpg,以便我们能够更好地处理大量的文件。


声明:本网站处理文件和版本的一个相当脆弱的方式,而不应被采用作为一个长期的解决方案。请注意关于问题的评论。

相关问题