중복 파일을 찾고 최신 파일만 유지하는 Linux 명령줄

중복 파일을 찾고 최신 파일만 유지하는 Linux 명령줄

많은 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.xml2019년 9월 1일 13:44 및 uk_3345_20190905_1600_b4ec24da7c59c1d889fb22ad9fad34aca882102e.xml2019년 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}'

관련 정보