Командная строка Linux для поиска повторяющихся файлов и сохранения только самых последних

В системе OpenBSD:

$ stat -f '%Sm' myfile
Apr 12 09:40:05 2018 

Формат %Smозначает «время модификации(m)в виде строки (S)».

Без Sвы получите отметку времени Unix:

$ stat -f '%m' myfile
1523518805

Это эквиваленты %yи %Yс GNU stat -c "FORMAT", за исключением небольшой разницы в формате вывода %y.

0
05.09.2019, 20:35
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}'
1
28.01.2020, 02:39

Теги

Похожие вопросы