Linux
Linux命令行查找重複文件並僅保留最近的文件
我有一個包含大量 XML 文件的目錄。
它們被標記為filename_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 生成的,我只想保留最近生成的文件。我需要使用的文件的唯一屬性是修改日期。
這是未經測試的:
# 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}'