Linux - сохраните только последние 10 папок и удалите остальные - PullRequest
8 голосов
/ 17 мая 2011

У меня есть папка, содержащая версии моего приложения, каждый раз, когда я загружаю новую версию, для нее создается новая подпапка, имя подпапки - текущая метка времени, здесь распечатка используемой основной папки.(ls -l | grep ^ d):

drwxrwxr-x 7 root root 4096 2011-03-31 16:18 20110331161649
drwxrwxr-x 7 root root 4096 2011-03-31 16:21 20110331161914
drwxrwxr-x 7 root root 4096 2011-03-31 16:53 20110331165035
drwxrwxr-x 7 root root 4096 2011-03-31 16:59 20110331165712
drwxrwxr-x 7 root root 4096 2011-04-03 20:18 20110403201607
drwxrwxr-x 7 root root 4096 2011-04-03 20:38 20110403203613
drwxrwxr-x 7 root root 4096 2011-04-04 14:39 20110405143725
drwxrwxr-x 7 root root 4096 2011-04-06 15:24 20110406151805
drwxrwxr-x 7 root root 4096 2011-04-06 15:36 20110406153157
drwxrwxr-x 7 root root 4096 2011-04-06 16:02 20110406155913
drwxrwxr-x 7 root root 4096 2011-04-10 21:10 20110410210928
drwxrwxr-x 7 root root 4096 2011-04-10 21:50 20110410214939
drwxrwxr-x 7 root root 4096 2011-04-10 22:15 20110410221414
drwxrwxr-x 7 root root 4096 2011-04-11 22:19 20110411221810
drwxrwxr-x 7 root root 4096 2011-05-01 21:30 20110501212953
drwxrwxr-x 7 root root 4096 2011-05-01 23:02 20110501230121
drwxrwxr-x 7 root root 4096 2011-05-03 21:57 20110503215252
drwxrwxr-x 7 root root 4096 2011-05-06 16:17 20110506161546
drwxrwxr-x 7 root root 4096 2011-05-11 10:00 20110511095709
drwxrwxr-x 7 root root 4096 2011-05-11 10:13 20110511100938
drwxrwxr-x 7 root root 4096 2011-05-12 14:34 20110512143143
drwxrwxr-x 7 root root 4096 2011-05-13 22:13 20110513220824
drwxrwxr-x 7 root root 4096 2011-05-14 22:26 20110514222548
drwxrwxr-x 7 root root 4096 2011-05-14 23:03 20110514230258

Я ищу команду, которая оставляет последние 10 версий (подпапки) и удаляет остальные.

Любыемысли?

Ответы [ 6 ]

27 голосов
/ 17 мая 2011

Вот, пожалуйста. (отредактированный)

ls -dt */ | tail -n +11 | xargs rm -rf

Сначала обновите список каталогов, затем возьмите все, кроме первых 10, затем отправьте их на rm -rf.

2 голосов
/ 16 января 2015

Если имена каталогов содержат дату, можно удалить все, кроме последних 10 каталогов, с сортировкой по умолчанию в алфавитном порядке

ls -d */ | head -n -10  | xargs rm -rf
2 голосов
/ 12 ноября 2012
ls -dt1 /path/to/folder/*/ | sed '11,$p' | rm -r 

это предполагает, что это единственные каталоги, а другие не присутствуют в рабочем каталоге.

  • ls -dt1 обычно печатает только самый новый каталог, однако /*/будет сопоставлять только каталоги и печатать их полные пути. 1 обеспечивает одну строку на матч / листинг t сортирует время с самым новым в верхней части.

  • sed занимает 11-ю строкувниз и печатает только те строки, которые затем передаются на rm.

Вы можете использовать xargs, но для тестирования вы можете удалить | rm -r, чтобы проверить, правильно ли перечислены каталоги в первую очередь.

1 голос
/ 17 мая 2011
ls -lt | grep ^d | sed -e '1,10d' |  awk '{sub(/.* /, ""); print }' | xargs rm -rf 

Пояснение:

  • перечислить все содержимое текущего каталога в хронологическом порядке (сначала самые последние файлы)
  • отфильтровать все каталоги
  • игнорировать 10 первых строк / каталогов
  • используйте awk для извлечения имен файлов из оставшегося вывода 'ls -l'

  • удалить файлы

0 голосов
/ 17 мая 2011

Ваши имена каталогов отсортированы в хронологическом порядке, что делает это легко.Список каталогов в хронологическом порядке - просто * или, точнее, [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9].Таким образом, вы хотите удалить все, кроме последних 10 из них.

set [0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/
while [ $# -gt 10 ]; do
  rm -rf "$1"
  shift
fi

(Если осталось более 10 каталогов, удалите самый старый.)

0 голосов
/ 17 мая 2011

EDIT:

find . -maxdepth 1 -type d ! -name \\.| sort | tac | sed -e '1,10d' | xargs rm -rf
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...