我想删除文件夹中的多余文件。就像是
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)。我需要它只取最后一个下划线之后的数字。
我想删除文件夹中的多余文件。就像是
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)。我需要它只取最后一个下划线之后的数字。
假设您的文件名始终采用 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)
这是如何工作的:
*.jpg
文件排序<name>
,然后再排序<numbers>
。
<number>
首先出现的最高的文件<name>
找到新文件(应该是最高的文件<number>
)请注意,find
使用它代替,ls *.jpg
以便我们可以更好地处理大量文件。
免责声明:这是处理文件和版本控制的一种相当脆弱的方式,不应作为长期解决方案采用。请注意发布在该问题上的评论。