Вы могли использовать банку вместо zip:
jar cfM /tmp/sub_dir/pertinent_dir.zip -C /tmp/sub_dir pertinent_dir
Можно искать самые старые файлы, и затем можно проверить, больше ли общее количество файлов затем N, файлы затем удаляют самые старые файлы сначала в сценарии, или можно также просто использовать следующий пример. Скажем, Вы не хотите удалять последние 3 последних файла:
ls -t1 | tail -n +4 | xargs rm -rf
Я собираюсь изменить ответ @Salton для создания этого более общим:
ls -1 | sort -t_ -n -k2 | head -$((`ls | wc -l`-1)) | xargs rm -rf
Эти виды на номере версии и игнорируют дату полностью. Так, если более старая версия будет иметь более новую дату, то более старая версия будет удалена.
В 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
непечатаемые символы искажений в именах файлов, но в Вашем случае, который не должен быть проблемой.