gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 09:30:39 25 4
gpt4 key购买 nike

我想删除文件夹中的多余文件。有点像

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)。我需要它只取最后一个下划线后的数字。

最佳答案

假设您的文件名始终采用 <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这样我们就可以更好地处理大量文件。


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

关于bash - 每个文件只保留一个版本 (bash),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12353856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com