このようなファイルは何千ものあります。
- 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
\
算術式で連想配列を安全に使用するには?