Как удалить все файлы и подкаталоги в каталоге БЕЗ удаления каталога в bash?

Вероятно, вы ищете gpgdir из пакета signing-party (стандартный репозиторий ubuntu), который может рекурсивно шифровать контуры.

Страница руководства находится здесь: http://manpages.ubuntu.com /manpages/saucy/man1/gpgdir.1.html

1
задан 3 November 2012 в 09:35

9 ответов

Единственная причина, по которой rm -r ./* работает не всегда, состоит в том, что вы можете иметь скрытые файлы и / или папку, которые не соответствуют *.

С этой целью bash предоставляют возможность чтобы * соответствовал всем, даже скрытым объектам:

cd dont-delete-me
shopt -s dotglob
rm -r ./*

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

shopt -u dotglob 
26
ответ дан 25 May 2018 в 17:34
  • 1
    Он также не может работать, когда у вас есть большое количество файлов – S.. 29 January 2016 в 23:04

Открыть терминал (Ctrl + Alt + T) ant type this:

find somedir -mindepth 1 -delete

Это будет соответствовать всем файлам и каталогам внутри somedir и его (grand-) детей, включая «скрытые» точечные файлы но исключая somedir из-за -mindepth 1, затем -delete их.

20
ответ дан 25 May 2018 в 17:34
  • 1
    Добро пожаловать в AskUbuntu! Хотя ваш ответ может потенциально помочь оригинальному плакату, отсутствие информации для объяснения того, что это сделает, чтобы помочь ему сделать ваш ответ неполным. – Oyibo 3 October 2012 в 12:37
  • 2
    Не хватает объяснений, но все же лучший ответ. Также работает в OSX (за исключением, конечно, способа открытия терминала, конечно). – noamtm 5 February 2015 в 18:43
find /dontDeleteMe/ -xdev -depth -mindepth 1 -exec rm -Rf {} \;

Используйте параметр xdev для удаления файлов только на границе устройства.

6
ответ дан 25 May 2018 в 17:34
  • 1
    Поиск GNU имеет -delete. Это подразумевает -depth и легче запомнить, чем -depth -exec rm -Rf {} \; – Nils Toedtmann 15 January 2015 в 17:38

Чтобы удалить (в терминале) все файлы и подкаталоги, за исключением базового каталога с именем «dontdelete»:

rm -rf dontdelete/*
4
ответ дан 25 May 2018 в 17:34
  • 1
    Это не удаляет скрытые файлы, поэтому "все файлы" может быть слишком смелым утверждением. – Stefan van den Akker 25 July 2015 в 18:55

Вы можете использовать find с флагом -delete:

find dontDeleteMe/* -delete

Важно /*, поскольку он сообщает find искать только INSIDE папка с именем «dontDeleteMe».

Также убедитесь, что флаг -delete находится в конце команды find.

4
ответ дан 25 May 2018 в 17:34
  • 1
    Это решение не удаляет скрытые файлы, если вы не включили dotglob. В противном случае использование опции флажка -mindepth 1 кажется единственным способом заставить его работать. – Stefan van den Akker 25 July 2015 в 18:59
rm -rf  directory/{.*,/*}

Что говорит:

Удалить все файлы, начиная с. в «каталоге» и во всех других файлах.

Хотя это не одобрено Neftas, это решение небезопасно!

Более безопасное решение:

 rm -rf directory/!(.|..)
3
ответ дан 25 May 2018 в 17:34
  • 1
    Эта команда потенциально может быть опасной, поскольку вы также включаете каталоги . и ... Этого можно избежать, изменив {.*} на {.??*}, но тогда вы не удалите скрытые файлы только с одним символом, например .a. – Stefan van den Akker 25 July 2015 в 15:13
  • 2
    что это? rm -rf directory /! (. | ..) – Tebe 25 July 2015 в 15:38
  • 3
    Это похоже на гораздо лучшее решение, чем то, с чем я столкнулся. Могу ли я предложить вам отредактировать свой ответ? – Stefan van den Akker 25 July 2015 в 15:49
  • 4
    предложение принято) – Tebe 25 July 2015 в 15:55

Я не уверен, почему это так сложно, помогите мне, если я ошибаюсь

cd DoNotDeleteDir #<- this is just to make sure we are inside
find . | xargs rm -rf

Вот оно

1
ответ дан 25 May 2018 в 17:34
  • 1
    У этого есть небольшой недостаток в попытке удалить текущий каталог, который, конечно, не работает, потому что он все еще используется как рабочий каталог вызывающей оболочки. – David Foerster 15 September 2015 в 16:26

Существует еще более простой ответ:

cd dontDeleteMe rm -rf *

Время основной лекции системы: обязательно обратите внимание на то, где вы находитесь, когда используете подметающие команды как это.

Я не могу сказать этого достаточно. Я должен был восстановить коробку, потому что кто-то не обращал внимания и набрал rm -rf *, когда находился в /.

* nix предполагает, что если вы являетесь пользователем root или если вы являетесь sudo-ing как root, вы знаете, что вы делаете. Поэтому убедитесь, что вы знаете, что делаете, прежде чем это сделать.

Альтернатива, которая гарантирует, что ваша команда «cd» работает до того, как вы выпустите «rm», будет использовать

cd dontDeleteMe && rm -rf *
1
ответ дан 25 May 2018 в 17:34
  • 1
    Это опасное предложение. Вы хотите: cd dontDeleteMe && rm -rf * – Izkata 27 October 2011 в 01:32
  • 2
    @Izkata Или убедитесь, что операция cd была успешной, перед выдачей команды rm. – Eliah Kagan 1 November 2011 в 23:42
  • 3
    @EliahKagan Это именно то, что делает мой фрагмент кода ... – Izkata 2 November 2011 в 00:00
  • 4
    На самом деле это не более или менее опасно, чем вы предлагаете. Все & amp; & amp; это значит объединить две команды вместе, чтобы они выполнялись одновременно. Если что-то мой метод действительно SAFER, так как вам нужно остановиться и .look перед выполнением rm -rf *. Приостановка двойной проверки всегда лучше. – user30619 4 November 2011 в 19:57
  • 5
    @ user30619 Оператор && не просто объединяет команды; это требует, чтобы каждая команда была успешной до того, как будет выполнена следующая. Если команда cd не работает по какой-либо причине (каталог не существует, привилегии и т. Д.), То команда rm не будет выполнена. Я бы назвал это безопаснее. – ean5533 10 November 2011 в 01:14
Самая простая вещь для меня - эксперт по Windows, но новичок ubuntu. Щелкните значок «Файлы» на панели запуска. Перейдите в каталог, в котором находятся файлы и папки, которые вы хотите удалить. Щелкните правой кнопкой мыши в пустой области окна рядом с файлы и нажмите «Открыть в терминале» - оставьте окно «Файлы» открытым. Окно терминала откроется и будет «установлено» в папку, в которой вы находитесь. Вы можете ввести «dir» (игнорировать кавычки, когда я говорю тип) и нажать enter для терминала чтобы показать список файлов и папок - просто чтобы доказать, что вы находитесь в правильной папке типа «rm -rf *» и нажмите «Ввод» в зависимости от размера папок / файлов, чтобы удалить систему, приостанавливается. Когда возвращается приглашение терминала, окно «Файлы» вы открыли, теперь скажут: «Папка пуста». У меня был успех с этим методом, и мне было удобно видеть файлы / папку как в окне «Файлы», так и в результате команды «Дир» в окне терминала мне также было приятно, что в окне «Файлы» отображается папка, теперь пустая - особенно, поскольку я преследовали эти файлы, ища папку для мусора, в которой они были. Спасибо всем, кто подал ответы - это было очень информативно
0
ответ дан 25 May 2018 в 17:34
  • 1
    Это кажется довольно запутанным - тем более, что вы все равно будете работать rm -rf *. – David Foerster 9 November 2016 в 04:46

Другие вопросы по тегам:

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