Я хочу удалить каталог B и D. Но я хочу сохранить C и все его дочерние файлы и каталоги. Что такое команда для удаления всех дочерних каталогов родительского каталога, кроме одного каталога и его дочерних.
Помощь приветствуется.
filesystem
directory
directory-structure
Джо Саад
источник
источник
A
в вашем примере)? Удалить их или оставить?Ответы:
Что вы хотите, это команда:
Демо-версия:
Объяснение:
find DIRECTORY
команда call find для работы с DIRECTORY-mindepth 1
: работать только с содержимым каталога, избегать самого каталога уровня 0-maxdepth 1
: предотвращает спуск в подкаталоги (rm -rf
в любом случае является рекурсивным, поэтому нам не нужно спускаться в подкаталоги для их удаления)-type d
: поиск только по каталогам-not \( -name "keepMe" \)
игнорировать элемент с именем, которое вы хотите сохранить-exec rm -rf {} \;
выполнить удаление на каждом найденном предметеисточник
find
здесь хороший друг, но у Башаfor
иtest
есть лучшие друзья ...>: - DИспользование расширенных функций glob оболочки bash (которые включены по умолчанию в текущих установках Ubuntu), учитывая
Вы можете обращаться ко всему, кроме
C
его содержимого, используя выражение glob,A/!(C)
т.е.Таким образом, чтобы удалить все, кроме каталога
C
и его содержимого, вы можете просто использоватьуход
источник
('"
когда я запускаю его удаленно черезssh $VM_ADDRESS "rm -rf $APP_FOLDER/!(node_modules)"
. Любые идеи? Большое спасибо.extglob
опция оболочки доступна только для интерактивных оболочек - не уверен, сможете ли выssh
сделать этоОдним из простых способов было бы использовать trash-cli
Вы можете установить его с
sudo apt-get install trash-cli
После установки вы можете перейти в родительский каталог A с помощью,
cd /A
а затем выполнить команду,trash B D
где B и D - каталоги, которые вы хотите удалить (они попадут в корзину для диска, на котором они находятся, поэтому, если вы сделаете ошибку, вы можете восстановить файлы)Протестировано под Ubuntu 16.04 и 14.04
источник
trash ! C
?trash: cannot trash non existent
! '`extglob
хотя.Просто используйте
for
цикл Bash иtest
отфильтруйте нужные каталоги, аrm -rf
команду рекурсивно удалите каталоги, например:Это перебирает все элементы (файлы и каталоги) внутри
/path/to/parent/
и рекурсивно удаляет элемент, если его имя не равноdir_survive
. Если родительский каталог является текущим каталогом, вы можете писать только*
как путь.Если вы не уверены и хотите сначала проверить, какие элементы будут удалены без каких-либо действий, просто замените
rm -rf
в приведенной выше команде наecho
и она выведет только кандидатов на удаление.Вот пример запуска:
источник