多くのファイルを含むディレクトリがあります。すべてのファイルは同じパターンを持っています<id>_data_<date>.csv
。私がしたいのは、すべてのファイルを削除し、それぞれの最新のファイルを維持することです<id>
。
例ディレクトリ:
10020077_data_2017-07-18_001.csv
10020078_data_2017-07-18_001.csv
10020209_data_2019-04-23_001.csv
10020209_data_2019-04-24_001.csv
10020209_data_2019-04-25_001.csv
10020209_data_2019-04-26_001.csv
10020209_data_2019-04-27_001.csv
10020209_data_2019-04-28_001.csv
10020272_data_2019-04-23_001.csv
10020272_data_2019-04-24_001.csv
10020272_data_2019-04-25_001.csv
10020272_data_2019-04-26_001.csv
10020272_data_2019-04-27_001.csv
10020272_data_2019-04-28_001.csv
10020286_data_2019-04-23_001.csv
予想される結果:
10020077_data_2017-07-18_001.csv
10020078_data_2017-07-18_001.csv
10020209_data_2019-04-23_001.csv <-- delete
10020209_data_2019-04-24_001.csv <-- delete
10020209_data_2019-04-25_001.csv <-- delete
10020209_data_2019-04-26_001.csv <-- delete
10020209_data_2019-04-27_001.csv <-- delete
10020209_data_2019-04-28_001.csv
10020272_data_2019-04-23_001.csv <-- delete
10020272_data_2019-04-24_001.csv <-- delete
10020272_data_2019-04-25_001.csv <-- delete
10020272_data_2019-04-26_001.csv <-- delete
10020272_data_2019-04-27_001.csv <-- delete
10020272_data_2019-04-28_001.csv
10020286_data_2019-04-23_001.csv
find -mtime
この場合、一部のIDは毎日新しいファイルを受け取り、他のIDは月に1回、または時には毎年新しいファイルを受け取るため使用できません。
私の考えは、IDに基づいてファイル名をグループ化し、最後のエントリを保持しないことです。 Bashを使用してこの問題をどのように解決できますか?
ベストアンサー1
ここでは、bashは特に必要ありません。sh
位置配列を2回利用すると、簡単なスクリプトでこれを行うことができます。外部ループは、必要なすべてのデータファイル(IDと日付部分のワイルドカード)を取得します。 ID部分を抽出し、そのIDを持つすべてのファイルを繰り返すサブシェルを起動します。その後、サブシェルはこれらのファイルの自然な日付順のリストを繰り返し、最新のファイルを保持しながら最後のファイルを除くすべてのファイルを削除します。
#!/bin/sh
set -- *_data_*.csv
for f in "$@"
do
id=${f%%_*}
# a subshell so we don't clobber $@
(
set -- "${id}"_data_*.csv
while [ "$#" -gt 1 ]
do
rm -- "$1"
echo "DELETE: $1"
shift
done
)
done
echo ... DELETE
提供したファイル名の結果を表示できるように説明を追加しました。
DELETE: 10020209_data_2019-04-23_001.csv
DELETE: 10020209_data_2019-04-24_001.csv
DELETE: 10020209_data_2019-04-25_001.csv
DELETE: 10020209_data_2019-04-26_001.csv
DELETE: 10020209_data_2019-04-27_001.csv
DELETE: 10020272_data_2019-04-23_001.csv
DELETE: 10020272_data_2019-04-24_001.csv
DELETE: 10020272_data_2019-04-25_001.csv
DELETE: 10020272_data_2019-04-26_001.csv
DELETE: 10020272_data_2019-04-27_001.csv