Удалить файлы кроме n файлов с “большим” именем?

Вы могли использовать банку вместо zip:

jar cfM /tmp/sub_dir/pertinent_dir.zip -C /tmp/sub_dir pertinent_dir
3
13.04.2017, 15:36
3 ответа

Можно искать самые старые файлы, и затем можно проверить, больше ли общее количество файлов затем N, файлы затем удаляют самые старые файлы сначала в сценарии, или можно также просто использовать следующий пример. Скажем, Вы не хотите удалять последние 3 последних файла:

ls -t1 | tail -n +4 | xargs rm -rf

1
27.01.2020, 21:11
  • 1
    Это предполагает, что время изменения является правильным — может не иметь место в зависимости от того, как файлы добрались там. (Например, сгенерированный от ответвления управления версиями будет обычно иметь дату, она была сгенерирована или возможно даже скопирована в сервер, не дата нового изменения) –  derobert 19.06.2013, 18:34
  • 2
    Да, я предположил, что сценарий сборки, генерирующий этот выпуск в каталоге и никакой ручной копии, происходит. –  Raza 19.06.2013, 18:40
  • 3
    я сделал модификацию порядка и добрался до результата, искренне поблагодарите Вас –  Feida Kila 19.06.2013, 18:57

Я собираюсь изменить ответ @Salton для создания этого более общим:

ls -1 | sort -t_ -n -k2 | head -$((`ls | wc -l`-1)) | xargs rm -rf

Эти виды на номере версии и игнорируют дату полностью. Так, если более старая версия будет иметь более новую дату, то более старая версия будет удалена.

5
27.01.2020, 21:11

В zsh, если Ваши версии находятся в лексикографическом порядке:

rm -f appname_*.tar.gz(N[1,-$((n+1))])

Спецификатор шарика [NUM1,NUM2] сохраняет только соответствия от NUM1 до NUM2. Со знаком "минус", количествами числа от конца (-1 последнее соответствие), таким образом, [1,-$((n+1))] соответствия все кроме последнего $n файлы. Спецификатор шарика N говорит, что хорошо, если там не идет ни в какое сравнение (который происходит, если существует не больше, чем $n файлы уже).

Если версии не находятся в лексикографическом порядке, Вы, возможно, должны отсортировать файлы в другом порядке. Спецификатор шарика n десятичные числа видов значением, таким образом, это будет работать правильно, если Вы будете иметь appname_9_somedate сопровождаемый appname_10_someotherdate.

rm -f appname_*.tar.gz(nN[1,-$((n+1))])

Если у Вас есть более сложные номера версий, можно указать собственную функцию вида. Запишите функцию zsh version_less это возвращается 0, если его первым аргументом являются меньше, чем его второй аргумент и использование

rm -f appname_*.tar.gz(N[1,-$((n+1))]o+version_less)

В любой оболочке, если порядок файлов является лексикографическим порядком, можно выполнить итерации через соответствия.

set appname_*.tar.gz
while [ $# -gt $n ]; do
  rm "$1"
  shift
done

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

2
27.01.2020, 21:11

Теги

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