1

Я видел некоторые лайнеры, использующие ls, но я бы хотел этого избежать.

Я пишу скрипт, который копирует код на мой сервер в папке с метками времени. «Текущая» версия всегда связана с постоянным путем. Таким образом, я могу откатиться, если что-то пойдет не так. Теперь при каждом развертывании создается новая папка, но я бы хотел оставить только 3 последних.

Вот моя текущая версия:

ls -tp | grep '/$' | grep -v 'current\|shared' | tail -n +4 | xargs -d '\n' rm -rf --

Это выполняется в содержащей папке, исключая файлы и две папки 'current' и 'shared', которые я хочу сохранить (текущая фактически является вышеупомянутой символической ссылкой), и удаляет все, кроме 3 самых новых, отсортированных по ls -t .

Есть ли способ, которым я могу сделать это без ls , и только используя bash и gnu toolchain?

Все папки, предназначенные для обрезки, имеют следующий формат:

$timestamp.$branch.$sha1

Где SHA1 и branch это информация из git о том, что именно было развернуто.

На сервере работает Ubuntu Xenial.

Изменить: приведите несколько примеров того, как выглядят папки

Вот список из папки развертывания, как это выглядит прямо сейчас:

drwxr-x--- 13 app www-data 4096 Mar 29 00:10 1490738956.develop.b806/
drwxr-x--- 13 app www-data 4096 Mar 29 00:19 1490739485.develop.ae01/
drwxr-x--- 14 app www-data 4096 Mar 29 03:33 1490751118.develop.f5b0/
lrwxrwxrwx  1 app www-data   40 Mar 29 03:33 current -> /home/app/deploy/1490751118.develop.f5b0/
drwx------  5 app root     4096 Mar 10 04:12 shared/

2 ответа2

1

Как удалить все, кроме самых последних 3 подпапок в папке?

Вы можете использовать find , sort , awk , xargs и, наконец, rm:

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" -printf "%T@ %p\n" | sort -nr | awk 'NR > 3 {print $2}' | xargs rm -rf

Сломать:

find универсальный инструмент для поиска файлов и каталогов и, возможно, выполнять команды на них

* учитывать элементы в текущей папке

-maxdepth 0 не смотрите в подпапках

-type d искать каталоги

-not -path "current" исключить каталог с именем "текущий"

-not -path "shared" исключить каталог с именем "shared"

-printf "%T@ %p\n" распечатать результаты, добавив отметку времени перед именами каталогов. Это может быть опущено в вашем случае, так как каталоги уже помечены.

| sort -nr отсортировать список по метке времени, в обратном порядке

| awk 'NR > 3 {print $2}' печатает все, кроме первых трех результатов, опуская отметку времени, которая была добавлена ранее. Это где вы выбираете, сколько оставить, просто подставьте число 3

| xargs rm -rf удаляет эти каталоги и все их содержимое

Изменить: в вашем случае, поскольку имена каталогов уже начинаются с метки времени, нет необходимости снова добавлять метку времени, чтобы sort -nr была эффективной. Обратите внимание, что синтаксис awk необходимо редактировать соответствующим образом.

find * -maxdepth 0 -type d -not -path "current" -not -path "shared" | sort -nr | awk 'NR > 3 {print $0}' | xargs rm -rf

Справка: посмотрите эти два полезных / похожих вопроса и ответов.

0

В самой основной форме

touch -t 201003160120 some_file
find . -maxdepth  0 -type d ! -newer some_file -name \*.develop.\* -delete

По данным https://serverfault.com/questions/122824/linux-using-find-to-locate-files-older-than-date

! -newer some_file говорит ему, чтобы соответствовать чему-то не новее, чем 'some_file'

-name \*.develop.\* * .velop. \* говорит ему, чтобы он совпадал только с именами, соответствующими этому шаблону (* .develop.*)

-delete - Я надеюсь , что это не требует объяснений, будьте осторожны! (Используйте -print при тестировании!)

-type d - только каталоги

-maxdepth 0 - не переходить в подпапки.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .