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

ファイル名が常に形式であると仮定すると<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 に答える