ファイル名のサフィックスが最も小さいファイルを削除する

ファイル名のサフィックスが最も小さいファイルを削除する

似たような名前だが、数字が増加するサフィックスを持つファイルのディレクトリがあります。小さいサフィックスのファイルを削除し、最大のサフィックスを持つファイルのみを残したいです。以下はファイル リストの例です。

1k_02.txt
1k_03.txt
1l_02.txt
1l_03.txt
1l_04.txt
2a_05.txt
2a_06.txt
4c_03.txt
4c_04.txt

上記のリストは以下のファイルに縮小する必要があります。

1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt

どこから始めればいいのかさえわかりませんが、可能であれば、単一の bash コマンドが欲しいです。

答え1

複雑なパイプライン:

ファイルリスト:

$ ls
1l_04.txt 2a_05.txt 4c_03.txt 1k_03.txt 1l_02.txt 4c_04.txt 2a_06.txt 1l_03.txt 1k_02.txt

printf "%s\n" * | sort -t'_' -k1,1 -k2nr | awk -F'_' 'a[$1]++' | xargs rm

結果:

$ printf "%s\n" *
1k_03.txt
1l_04.txt
2a_06.txt
4c_04.txt

答え2

zsh

$ ls
1k_02.txt  1l_02.txt  1l_04.txt  2a_06.txt  4c_04.txt
1k_03.txt  1l_03.txt  2a_05.txt  4c_03.txt
$ (typeset -A seen; for f (*_*(nOn)) let 'seen[${f%_*}]++' && rm -- $f)
$ ls
1k_03.txt  1l_04.txt  2a_06.txt  4c_04.txt

(見る算術式内で連想配列を安全に使用するにはどうすればよいでしょうか?let代わりにを使用している理由については、((...))ここを参照してください。

関連情報