Как удалить файлы с пробелами старше 20 дней, оставив последние 4, даже если они старше 20 дней? - PullRequest
0 голосов
/ 16 мая 2019

Как удалить файлы с пробелами старше 20 дней, оставив последние 4, даже если они старше 20 дней?

Примеры файлов (где в имени 1 - самый старый файл):

reckless 1.txt
reckless 2.txt
reckless 3.txt
reckless 4.txt
reckless 5.txt
reckless 6.txt
reckless 7.txt
reckless 8.txt
confidence1.txt
confidence2.txt
confidence3.txt
choke-1.txt
choke-2.txt
choke-3.txt
choke-4.txt
choke-5.txt
choke-6.txt
choke-7.txt
choke-8.txt
choke-9.txt
choke-10.txt
cruel_1_1.txt
cruel_1_2.txt
cruel_1_3.txt
cruel_1_4.txt
cruel_1_5.txt
cruel_2_1.txt
cruel_2_2.txt
cruel_2_3.txt
cruel_2_4.txt
cruel_2_5.txt
cruel_2_6.txt
cruel_2_7.txt
level_1.txt

Получается, что следует удалить из этого списка:

reckless 1.txt
reckless 2.txt
reckless 3.txt
reckless 4.txt
choke-1.txt
choke-2.txt
choke-3.txt
choke-4.txt
choke-5.txt
choke-10.txt
cruel_1_1.txt
cruel_2_1.txt
cruel_2_2.txt
cruel_2_3.txt

Попробовал что-то похожее отсюда: https://stackoverflow.com/a/20034914

Но не понял, как сделать сортировку по необходимому условию.

1 Ответ

0 голосов
/ 16 мая 2019

Если в каждом имени файла нет символов новой строки, попробуйте следующее:

while IFS= read -r line; do
    array=()
    while IFS= read -r file; do
        [[ $file =~ ^[0-9]+\ (.*)$ ]] && array+=("${BASH_REMATCH[1]}")
    done < <(
    find . -name "$line*.txt" -type f -mtime +20 -printf "%T@ %p\n" | sort
    )
    for (( i=0; i<${#array[@]}-4; i++ )); do
        rm -- "${array[$i]}"
    done
done < <(
for f in *.txt; do
    [[ $f =~ ^(.*)[-_\ ]+[0-9]+\.txt$ ]] && echo "${BASH_REMATCH[1]}"
done | uniq
)

[Пояснения]

  • Прежде всего, оно удаляетномера суффиксов и расширения из имен файлов для извлечения корневого имени в качестве имени группы.
  • Затем он находит отдельные файлы групп, которые старше 20 дней, и сортирует их по mtime.
  • Затемудаляет старые файлы, сохраняя до четырех последних файлов в группе.

Если имена файлов do содержат символы новой строки, небольшая модификация и поддержка опции -z команды sortответит на требование.

...