У меня есть каталог, содержащий несколько таких папок:

/
   20170901150843
   20170902123221
   20170903203423
   20170904123245
   20170905115432

Я хотел бы удалить все каталоги и сохранить только последние 2. (2 самых новых)

Как я могу это сделать ?

4 ответа4

0

Если они будут названы таким образом, это будет работать.

find . -maxdepth 0 -type 'd' | sort -r | tail -n +2 | while read line; do rm -rfv "$line"; done

Объяснение:

  1. Найти каталоги в текущем рабочем каталоге
  2. Сортировать их имена в обратном порядке (важно для следующего шага)
  3. Прочитать все, кроме первых 2 строк ввода на выходе
  4. Удалить (рекурсивно, принудительно и многословно) запись (в данном случае директорию) с именем, соответствующим каждой строке ввода
0

Попробуй это. Это всегда хорошо, чтобы быть ясно с тем, что вы пытаетесь сделать.

find . -mindepth 1 -maxdepth 1 -type d | \
    grep -vE '\./(20170904123245|20170905115432)' | \
    xargs rm -rf
0

Я хотел бы создать список имен каталогов из одного столбца, например, в файле с именем bb.out. Отредактируйте файл и удалите 2 каталога, которые вы хотите сохранить. Обязательно удалите эти 2 каталога. Затем создайте и отредактируйте новый файл, скажем, aa.out. В aa.out поместите много строк, содержащих только rm -f. Вы можете сделать это быстро и легко, набрав 5 строк rm -rf, а затем один раз скопировать и вставить несколько раз, чтобы aa.out имел столько же или больше строк, как bb. из. Теперь просто введите paste aa.out bb.out > cc.out Теперь просто введите cc.out, и он удалит все ваши файлы. cc.out будет просто содержать n строк в rm -rf filename .

0

Следующие должны сделать это:

ls -Fd DirPath/20*|grep '/$'|head -n -2|while read -r d; do rm -rf "$d"; done

Это работает следующим образом:

  • ls списки в записях порядка имен в DirPath начинающихся с 20 .
  • Опция -F классифицирует файлы с последним символом, который является / для каталогов.
  • Опция -d перечисляет имена каталогов, а не их содержимое.
  • grep гарантирует, что файлы, которые не являются каталогами, исключены.
  • head копирует все строки, кроме двух последних.
  • while read -r d назначает переменную d каждому каталогу по очереди.
  • Для каждого каталога rm -rf удаляет его.

Заметки:-

  • Я рекомендую вам поставить echo перед rm во время тестирования, чтобы убедиться, что вы удаляете нужные каталоги.
  • Вам может понадобиться разработать маску, если есть другие каталоги, начинающиеся с 20 , например, 20[1-9][0-9][01][0-9]* или что-то еще более подробное.
  • Вы можете использовать xargs rm -rf вместо в while цикла: это будет работать в вашем случае, но я позволил технике быть распространена на более общем случае , когда может быть встроены пробела в именах.

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