日付に基づいて重複したファイル名を削除する

日付に基づいて重複したファイル名を削除する

このようなファイルは何千ものあります。

  • wrfout_d03_2010-06-11_00:00:01
  • wrfout_d03_2010-06-11_00:00:08
  • wrfout_d03_2010-06-12_00:00:20
  • wrfout_d03_2010-06-12_00:00:35
  • wrfout_d03_2010-06-12_00:00:40

最初のタイムスタンプを維持するだけです。この場合、

  • wrfout_d03_2010-06-11_00:00:01
  • wrfout_d03_2010-06-12_00:00:20

1つずつ削除せずにこれを行う方法がわかりますか?ありがとうございます!

ベストアンサー1

そしてzsh

typeset -A seen=()
for f (wrfout_d*(N)) (( seen[\${f%_*}]++ )) && echo rm -f $f

echo(結果が満足であれば削除してください)

これに対応する内容bash(bash 4.0以降の仮定)は次のとおりです。

(shopt -s nullglob
typeset -A seen=()
for f in wrfout_d*; do
   (( seen[\${f%_*}]++ )) && echo rm -f "$f"
done)

グローバル拡張は語彙順にソートされているため、実際には時間順に一致するタイムスタンプ形式を使用します。したがって、上記では、最も古いものから最も若いものまで順番にファイルを繰り返し、最短の末尾( )が削除された名前を見た場合_*(連想配列に記録されているように)ファイルを削除します。算術式の理由については、次を参照してください。${f%_*}$seen A\算術式で連想配列を安全に使用するには?

おすすめ記事