我想删除文件夹中的冗余文件。像
这样的东西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)。我需要它只取最后一个下划线后的数字。
答案 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)
这是如何运作的:
*.jpg
排序所有<name>
个文件,然后按<numbers>
排序。
<number>
第一个<name>
(应该是<number>
最高的那个请注意,find
代替ls *.jpg
,因此我们可以更好地处理大量文件。
免责声明:这是处理文件和版本控制的一种相当脆弱的方式,不应作为长期解决方案采用。请注意问题上发表的评论。