Найти вывод команды для сортировки, а затем удалить

Я хочу найти в своих путях несколько файлов на основе некоторого шаблона, а затем я хочу сохранить только 3 последних файла этого шаблона и другие, которые я хочу удалить.

С zsh :

 echo rm -f ./**/*pattern*(.Dom[4,-1]) 
  • **/ любой уровень подкаталогов
  • (...) квалификаторы glob для квалификации матча по другим критериям:
  • . : только обычные файлы
  • D : включить точечные файлы (скрытые файлы) и посмотреть скрытые каталоги
  • om : порядок по времени модификации (от самого нового к старому)
  • [4,-1] : от 4- го до последнего (поэтому пропускаются первые 3).

(удалите echo чтобы сделать это)

Для эквивалента, использующего любую оболочку POSIX и утилиты GNU:

 (export LC_ALL=C find . -name '*pattern*' -type f -printf '%T@/%p\0' | sort -zrn | tail -zn +4 | cut -zd/ -f2- | xargs -r0 echo rm -f) 

(удалите echo чтобы сделать это)

В старых версиях утилит GNU может потребоваться:

 (export LC_ALL=C find . -name '*pattern*' -type f -printf '%T@/%p\0' | tr '\n\0' '\0\n' | sort -rn | tail -n +4 | cut -d/ -f2- | tr '\n\0' '\0\n' | xargs -r0 echo rm -f) 

ну, сортировка требует логики, но пока:

 # Создайте массив с файлами, на которые вы хотите ориентироваться
 ФАЙЛЫ = $ (найти $ {PATH_TO_FOLDER} -типа f -name "what.whwhat")
 # Получить общий размер массива 
 TotalSize = $ {# FILES [@]}
 # Отнимите 3 от общего размера, чтобы создать порог
 STOPAT = (($ {TotalSize} -3))
 # Объявить счетчик на 0
 Счетчик = 0
 # повторять файл за файлом в массиве
 для ФАЙЛА в "$ {FILES [@]}"
 делать
    # убедитесь, что вы делаете это, пока не останется 3 файла
    в то время как [$ {counter} -le $ {stopat}]
    делать
       rm -v $ {FILE}
       ((Счетчик ++))
    сделанный
 сделанный

при использовании -name вы можете использовать расширенные выражения, например *.sh или hello*.sh или *hello.sh и т. д.

Обратите внимание, что приведенная выше команда удалит все файлы, кроме 3. Используйте команду sort для сортировки файлов по своему усмотрению (используя размер, дату создания или изменения) здесь:

FILES=$(find ${PATH_TO_FOLDER} -type f -name "whatever.whatever")