Как удалить все подкаталоги из каталога?

Этот вопрос относится к фазе II к первому вопросу, который я написал здесь

У меня есть каталог, который содержит кучу подкаталогов, .zip-файлов и других случайных файлов, не содержащихся в подкаталоге.

Я хочу, чтобы сценарий командной строки удалял все подкаталоги из родительского каталога, но сохранял все zip-файлы и незакрепленные файлы, которые не принадлежат ни одному из подкаталогов. Все подкаталоги имеют контент, поэтому я считаю, что мне нужно будет принудительно удалить их с помощью команды -f.

Таким образом, команда, которая просматривает родительский каталог (или текущий каталог), удаляет из него все папки, но сохраняет все остальные содержимое и файлы, которые не являются папкой или содержатся в папке.

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

5 Solutions collect form web for “Как удалить все подкаталоги из каталога?”

В BASH вы можете использовать конечную косую черту (я думаю, она должна работать в любой оболочке POSIX):

rm -R -- */ 

Обратите внимание: -- который отделяет параметры от аргументов и позволяет удалять записи, начинающиеся с дефиса – в противном случае после расширения оболочкой имя записи будет интерпретироваться как опция rm (то же самое выполняется для многих других утилит командной строки).

Добавьте параметр -f если вы не хотите получать запрос на подтверждение при удалении файлов, не подлежащих записи.

Обратите внимание, что по умолчанию скрытые каталоги (те, чье имя начинается с . ) Будут оставлены в покое.

Важное предупреждение: расширение */ также будет включать символические ссылки, которые в конечном итоге будут разрешены к файлам каталога типов. И в зависимости от реализации rm , rm -R -- thelink/ будет либо просто удалять символическую ссылку, либо (в большинстве их) рекурсивно удалять содержимое связанного каталога, но не сам этот каталог, ни символическую ссылку.

Если использовать zsh , лучшим подходом было бы использовать квалификатор glob для выбора файлов только для каталогов типов:

 rm -R -- *(/) # or *(D/) to include hidden ones 

или:

 rm -R -- *(-/) 

для включения символических ссылок в каталоги (но поскольку на этот раз расширение не имеет конца / s, это только символическая ссылка, которая удаляется всеми реализациями rm ).

С bash , AT & T ksh , yash или zsh вы можете делать:

 set -- */ rm -R -- "${@%/}" 

для разметки конечного / .

В дополнение к шаблону, вы также можете использовать find (по крайней мере GNU find) для этого:

 find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 rm -R 

Как и в других линиях find , вы можете запустить первую часть ( find -mindepth 1 -maxdepth 1 -type d ), чтобы просмотреть список каталогов, которые будут удалены.

Более безопасный вариант – сделать что-то вроде этого:

 find -mindepth 1 -maxdepth 1 -type d -print0 | xargs -0 mv -i -t ../to-rm # or mv -i -t ../to-rm */ # or mv -i */ ../to-rm 

любой из которых переместит все ../to-rm в ../to-rm вместо его удаления. Вы можете проверить, что он сделал то, что вы хотели, их rm -Rf этот каталог на досуге.

вы можете создать сценарий для некоторых из этих предложений, особенно rm -R -- */ , и сохранить его в папке / usr / local / bin; или создать alias в файле ~ / .bashrc. Так как это очень легко ввести в заблуждение команду и сломать вашу систему – даже одна буква и / или порядок букв могут привести к катастрофическим последствиям – это будет несколько более надежным решением, чем набрать различные параметры и аргументы каждый раз, когда вы хотите выполнить эту задачу.

Кроме того, вы можете включить в свой скрипт / команду параметр -i or --interactive=once или -I or --interactive=always который будет служить еще одним инструментом для предотвращения непреднамеренных удалений.

Кроме того, было предложено что-то вроде «derobert»; просто скопируйте / вставьте сценарий в файл / терминал-редактор и настройте его на свои конкретные нужды, а файлы / каталоги будут перемещены в один каталог (содержимое которого вы можете проверить / проверить), которое вы можете просто удалить выдача команды rm -rf .

Другой вариант – использовать GUI-приложение, такое как ваш файловый менеджер, и просто выбрать все применимые файлы / папки, которые вы хотите удалить. Проверьте свои справочные страницы вашего дистрибутива, если у вас нет разрешений.

Наконец, если папки пусты – по существу простые имена файлов, вы можете использовать команду rmdir для их удаления. Он не работает для всего, что вы, возможно, захотите удалить, но это будет полезно в тех случаях, когда вы захотите сделать «уборку дома». ** вы можете попробовать параметр -p --ignore-fail-on-non-empty , который позволит вам удалить определенные подкаталоги, а также их пустые «родители» – каталоги, в которых они находятся.

Сначала вам нужно перечислить каталоги, а затем удалить их, не мешая нормальным файлам, ls -d * /, только перечисляет подкаталоги, а трубопровод с помощью rm удаляет каталоги и содержимое, сохраняя свободные файлы неповрежденными.

Эта команда должна выполнять эту работу,

 ls -d */ | xargs rm -rf 

rm -rf <directory name> . Оно работает. Просто введите rm <directory name> просто приводит к числу вопросов, в которых каждый из подкаталогов должен быть удален вручную. Но rm -rf помогает сразу удалить весь каталог вместе со своими подкаталогами.

  • Совместите следующий шаблон, который меньше предыдущего совпадения
  • Помощник Scrabble в bash
  • Команда scp ведет себя по-разному при использовании с функцией expect
  • Как отлаживать / проверять файл `--exclude-from` для` tar`?
  • для цикла в списках bash для точек и двухточечных папок
  • Как я могу сделать bash не соответствовать `.` и` ..` с `. *`
  • Инициализация поиска в vi перед запуском
  • Почему tar --exclude = ". *" Создает пустой архив?
  • Соответствие IP-адреса в указанном диапазоне с помощью awk
  • Как включить несколько конфигурационных файлов в php-fpm?
  • Как использовать mogrify convert только в файлах с определенной датой создания?
  • Linux и Unix - лучшая ОС в мире.