多くのXMLファイルを含むディレクトリがあります。
それらは次のように表示されます。ファイル名_date_time_checksum.xml、これは何千もの同じファイルがありますが、チェックサムで区切られていることを意味します。
filename_date_time_*.xmlが存在する場合は、最後に変更されたバージョンを保持し、残りのバージョンを削除するように実行できるコマンドラインはありますか?
例:
uk_3345_20190905_1600_b4ec24da7c59c1d889fb22ad9fad34aca882102e.xml
uk_1552_20190905_1605_1a31fd97541bf300d5bf4c0c4a349e00eee5a8fb.xml
uk_1552_20190905_1605_3d307e3ffbb3259a47a1bc1690c17fd291fe2cb0.xml
uk_1552_20190905_1605_7da5fa3b26cbe04eb01c6308c7b680fb4eb2e463.xml
uk_1552_20190905_1605_b4ec24da7c59c1d889fb22ad9fad34aca882102e.xml
uk_1552_20190905_1605_d01c541fc8db736d223a21a29d9766532140fdb8.xml
uk_1552_20190905_1605_fac6793f2f7e5374157c5d08ee555fcf1bbbf5f2.xml
uk_3345_20190905_1600_1a31fd97541bf300d5bf4c0c4a349e00eee5a8fb.xml
uk_3345_20190905_1600_d01c541fc8db736d223a21a29d9766532140fdb8.xml
これらのファイルはいつでも作成できます。ファイルがuk_3345_20190905_1600_d01c541fc8db736d223a21a29d9766532140fdb8.xml
2019年9月1日13:44およびuk_3345_20190905_1600_b4ec24da7c59c1d889fb22ad9fad34aca882102e.xml
2019年9月2日09:00に作成された場合は、最新に作成されたファイルのみを維持したいと思います。私が作業しなければならないファイルの唯一の属性は変更日です。
答え1
これはテストされていません。
# find the *latest* file for each prefix
declare -A mtime name
stat -c "%Y %n" *xml |
while read -r time filename; do
prefix=${filename%_*}
if (( $time > ${mtime[$prefix]:-0} )); then
mtime[$prefix]=$time
name[$prefix]=$filename
fi
done
# put the filenames into an associative array for easy lookup
declare -A keep
for filename in "${name[@]}"; do
keep[$filename]=1
done
# look at teach file to determine its fate
for file in *xml; do
if [[ -v keep[$file] ]]; then
echo "# keep $file"
else
echo "rm $file"
fi
done
あるいは、パイプは保持したいファイルを出力する必要があります。
paste <( printf "%s\n" *.xml) \
<( printf "%s\n" *.xml | cut -d _ -f 1-4) \
<( stat -c '%Y' *.xml) |
sort -k2,2 -k3,3rn |
awk '!seen[$2]++ {print $1}'