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

Используйте DYLD_INSERT_LIBRARIES вместо LD_PRELOAD на Mac OS. Вы, возможно, должны установить DYLD_FORCE_FLAT_NAMESPACE также. Например.

DYLD_INSERT_LIBRARIES=./libfaketime.so.1 DYLD_FORCE_FLAT_NAMESPACE=y FAKETIME="-15d" date
53
13.04.2017, 15:36
5 ответов

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

rm -R -- */

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

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

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

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

При использовании zsh, лучший подход должен был бы использовать спецификатор шарика для выбора файлов каталога типа только:

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

или:

rm -R -- *(-/)

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

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

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

разделять запаздывание /.

64
27.01.2020, 19:33
  • 1
    Красивый! Это работает отлично. Я не понял, что было настолько легко сделать. Вы возражали бы уточнять-r по сравнению с-R и что делают те команды?Большое спасибо. –  Evster 22.03.2013, 23:28
  • 2
    Unix -r, -R, --recursive синонимы, означающие, "удаляют каталоги и их содержание рекурсивно". –  peterph 22.03.2013, 23:39
  • 3
    можно ли объяснить, что - и */делают? задачей –  amphibient 22.03.2013, 23:42
  • 4
    Можно также сказать rm -R ./*/ - Это также избегает проблем с именами дефиса. –  l0b0 23.03.2013, 11:08
  • 5
    Просто бойтесь изменять порядок * и/. комната-R-/* делает что-то полностью различное, что Вы не можете хотеть происходить :| –  ChrisOdney 07.07.2017, 16:18

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

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 вместо того, чтобы удалить его. Можно проверить, что это сделало то, что Вы хотели, их rm -Rf тот каталог на Вашем досуге.

13
27.01.2020, 19:33
  • 1
    +1 для "Корзины CLI" to-rm и find который приятно обрабатывает каталоги, начинающиеся с точки (в дополнение к любому другому громоздкому выходу). :) –  peterph 23.03.2013, 00:24
  • 2
    спасибо за подсказку. Мне нравится идея переместиться в отдельный каталог перед удалением. Я работаю через Терминал над Mac OS X, и я полагаю, что должен был бы установить некоторый пакет GNU для использования-mindepth и команд-maxdepth, корректных? –  Evster 23.03.2013, 00:25
  • 3
    @Evster, не уверенный, если Mac OS X находит поддержки ими. Я предположил бы штрейкбрехера (это все еще вокруг?) мог установить находку, которая делает. Или Вы могли опустить их и затем отфильтровать произведенный список файлов с помощью grep. Определенно используйте mv опцию на этом, istead комнаты –  derobert 23.03.2013, 00:52

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

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

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

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

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

4
27.01.2020, 19:33
  • 1
    Это - действительно хорошая идея создать отдельный сценарий, я могу призвать к этой команде. Можно ли объяснить, что точно делают-i и-I опции?Спасибо! –  Evster 23.03.2013, 02:33
  • 2
    I предложит Вам однажды после удара, "Входят", чтобы подтвердить, что Вы хотите удалить это (когда существует больше чем 3 "выбранные" файла/папки); тогда как-i опция выпустит подсказку для каждого файла, на который можно просто подтвердить путем ответвления "y" и "Войти" - что-либо помимо утвердительного ответа приведет к тому определенному файлу, пропускаемому во время процесса удаления. –  ILMostro_7 23.03.2013, 02:57

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

0
27.01.2020, 19:33

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

Эта команда должна выполнить задание,

ls -d  */ | xargs rm -rf
0
27.01.2020, 19:33

Теги

Похожие вопросы