Как в Unix удалить все в текущем каталоге и под ним?

Я знаю, что это удалит все в подкаталоге и под ним:

rm -rf <subdir-name>

Но как удалить все в текущем каталоге, а также все подкаталоги под ним и содержимое всех этих подкаталогов?


person Yen    schedule 04.05.2009    source источник
comment
Это должен быть обман: stackoverflow.com/questions/550922/   -  person jmucchiello    schedule 04.05.2009


Ответы (10)


Практикуйте безопасные вычисления. Просто поднимитесь на один уровень выше в иерархии и не используйте подстановочное выражение:

cd ..; rm -rf -- <dir-to-remove>

Два дефиса -- сообщают rm, что <dir-to-remove> не является параметром командной строки, даже если он начинается с дефиса.

person tvanfosson    schedule 04.05.2009
comment
Потому что вы специально сопоставляете именованный каталог и, таким образом, с меньшей вероятностью удалите что-то, что вы не собираетесь удалять. - person tvanfosson; 04.05.2009
comment
Истинный. Я мог представить, что делаю это довольно легко. - person Yen; 04.05.2009
comment
не удаляет ли он и сам каталог? После этого вы должны сделать mkdir ‹dir-to-remove›. Но тогда любая жесткая ссылка, ссылающаяся на этот каталог, впоследствии станет отдельным каталогом. - person Johannes Schaub - litb; 04.05.2009
comment
litb, я знаю, что у меня есть файловая система, которая разрешает жесткие ссылки на каталоги, но я очень сомневаюсь, что она есть и у вас. - person Joshua; 04.05.2009
comment
Соглашаться. Примечание: rm -rf . оставит вас в заниженном состоянии без текущего каталога. Unix не терпит неопределенного состояния. - person dkretz; 04.05.2009
comment
@Joshua У меня есть файловая система, которая также разрешает жесткие ссылки на каталоги; он называется HFS+, и он есть у всех, кто работает под управлением Mac OS X 10.5 и выше. - person Brian Campbell; 04.05.2009
comment
@ Джошуа, я не знал, что не могу делать жесткие ссылки на каталоги в Linux с помощью ext3. Но я просто пытался, и это не позволило мне сделать это. Хорошая мысль чувак :) - person Johannes Schaub - litb; 04.05.2009
comment
Для большей безопасности вам нужно убедиться, что rm не интерпретирует имя каталога как опцию: cd ..; rm -rf -- <dir-to-remove> - person Flimm; 09.12.2011
comment
найдя это сейчас, после того, как я только что удалил ВСЕ на своем сервере. Я новичок в Unix, но у меня есть опыт работы с DOS, и синтаксис немного отличается, поэтому я сделал ошибку. Я сделал rm -rf /*, намереваясь удалить все в текущем каталоге, но удалил все в корне. Rackspace восстанавливает нас сейчас. В будущем я буду придерживаться этого совета и избегать подстановочных знаков! Спасибо! - person Max Hodges; 13.08.2012
comment
@Yen, если вы используете rm ./, вы можете случайно ввести rm . /, что может привести к катастрофе. - person irfandar; 12.10.2012
comment
@MaxHodges Сегодня я сделал что-то подобное на своем MacBook. Я случайно сделал sudo rm -R / при попытке удалить текущий каталог. У меня чуть инфаркт не случился! К счастью, к тому времени, когда я нажал ‹CTRL› + C, он удалил только приложения от A до E в /Applications. Я смог легко вернуть их с помощью Pacifist и установочного диска OS X. Фу... - person ; 19.03.2013
comment
хм... я думал, что он хочет удалить все в текущем каталоге, но не сам каталог... как нам это сделать? - person Tim Boland; 10.03.2017

Удаляет все файлы/каталоги ниже текущего.

find -mindepth 1 -delete

Если вы хотите сделать то же самое с другим каталогом, чье имя у вас есть, вы можете просто назвать его

find <name-of-directory> -mindepth 1 -delete

Если вы хотите удалить не только его подкаталоги и файлы, но и сам каталог, опустите -mindepth 1. Сделайте это без -delete, чтобы получить список вещей, которые будут удалены.

person Johannes Schaub - litb    schedule 04.05.2009
comment
Мне нужно было удалить все файлы в подкаталогах, но не хотелось удалять сами подкаталоги. find ‹name-of-directory› -mindepth 2 -delete сработало отлично! - person Tim Dearborn; 14.05.2013
comment
Вам нужно -mindepth 1, если вы указываете каталог (find <name-of-directory> -mindepth 1 -delete). В противном случае Йоханнес прав, он не удалит текущий рабочий каталог (при использовании find -delete). - person Weboide; 19.07.2013
comment
ИМО, это лучший ответ, особенно в сценариях. - person wizonesolutions; 17.07.2015
comment
Я пробовал: find -mindepth 1 -delete, но получил illegal option -- m, но он отлично работал, когда я удалил опцию mindepth find . -delete - person sharon; 06.05.2016

Что я всегда делаю, так это печатаю

rm -rf *

и затем нажмите ESC-*, и bash расширит * до явного списка файлов и каталогов в текущем рабочем каталоге.

Преимущества:

  • Я могу просмотреть список файлов, которые нужно удалить, прежде чем нажать ENTER.
  • История команд не будет содержать «rm -rf *» с неповрежденным подстановочным знаком, который может быть случайно повторно использован не в том месте и не в то время. Вместо этого в истории команд будут фактические имена файлов.
  • Также стало удобно один или два раза ответить «подожди секунду… какие файлы я только что удалил?». Имена файлов видны в буфере прокрутки терминала или в истории команд.

На самом деле, мне это так нравится, что я сделал это поведение по умолчанию для TAB с этой строкой в ​​.bashrc:

bind TAB:insert-completions
person Ville Laurikari    schedule 04.05.2009
comment
Отсутствует -- в этом ответе? Этот подход в целом потрясающий, я должен сказать. - person Ben Voigt; 14.03.2014
comment
лучший способ запустить это с помощью sudo - person Abbas Torabi; 12.04.2020

Использовать

rm -rf *

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

Более безопасная версия IMO заключается в использовании:

rm -ri * 

(это запрашивает подтверждение перед удалением каждого файла/каталога.)

person dirkgently    schedule 04.05.2009
comment
Может быть рискованным удивительно лаконичен. - person ; 04.05.2009
comment
Делая такие вещи, я нашел быстрый ls -r . сначала позволяет увидеть, что вы собираетесь удалить. Полезно, чтобы дать быстрое представление о том, что вы не собираетесь удалять весь диск... - person Rich Bradshaw; 04.05.2009
comment
Почему это более рискованно, чем rm -rf ‹subdir-name›? - person Yen; 04.05.2009
comment
@liw.fi: мой .bashrc обычно имеет это: псевдоним rm=rm -i. - person dirkgently; 04.05.2009
comment
@Yen - потому что, если вы сделаете это не в том месте, вы можете получить катастрофические результаты. Использование определенного имени в неправильном месте может привести к ошибке только в том случае, если там существует такой же подкаталог. - person tvanfosson; 04.05.2009
comment
Есть ли вероятность того, что он следует .. и пытается удалить родительские каталоги? Не то чтобы я думал, что это так, но мне лучше не пробовать это на моем ящике. - person Johannes Schaub - litb; 04.05.2009
comment
Вы не можете удалить родителя, находясь в дочернем элементе. - person dirkgently; 04.05.2009
comment
Когда я попытался запустить эту команду, она не удалась, говоря: rm: невозможно удалить .' or ..' - person Yen; 04.05.2009
comment
Тогда у вас не останется другого выбора, кроме как использовать подстановочное выражение *. - person dirkgently; 04.05.2009
comment
Давным-давно я прочитал удивительно вдохновляющую историю о rm -rf *, выполненном в корневом каталоге. Автор поймал его до того, как он завершился с помощью /bin, и реконструировал систему, используя только команды, расположенные в конце алфавита (более ранние были удалены). - person David Thornley; 04.05.2009
comment
@David: Вы, вероятно, думаете об этой истории: ee.ryerson.ca /~elf/hack/recovery.html - person sth; 04.05.2009
comment
Отсутствует -- в этом ответе? - person Ben Voigt; 14.03.2014

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

При этом, если вы похожи на меня и у вас одновременно открыто несколько окон терминала, вам лучше быть в безопасности и использовать rm -ir .. Давайте посмотрим на аргументы команды, чтобы понять, почему.

Во-первых, если вы посмотрите на rm справочную страницу команды (man rm в большинстве Unix), вы заметите, что –r означает «рекурсивно удалить содержимое каталогов». Таким образом, выполнение только rm -r . удалит все в текущем каталоге и все, что находится под ним.

В rm –rf . добавленный -f означает «игнорировать несуществующие файлы, никогда не запрашивать». Эта команда удаляет все файлы и каталоги в текущем каталоге и никогда не предлагает вам подтвердить, что вы действительно хотите это сделать. -f особенно опасен, если вы запускаете команду под привилегированным пользователем, поскольку вы можете удалить содержимое любого каталога, не получив шанса убедиться, что это действительно то, что вам нужно.

С другой стороны, в rm -ri . -i, который заменяет -f, означает "запрашивать перед удалением". Это означает, что у вас будет возможность сказать «упс! Это не то, чего я хочу», прежде чем rm счастливо удалит все ваши файлы.

Когда я был системным администратором, я делал rm -rf / в системе с полными привилегиями (root). В итоге прошло два дня восстановления системы из резервных копий. Вот почему я сейчас нанимаю rm -ri.

person Pierre-Luc Simard    schedule 04.05.2009

Как насчет:

rm -rf "$(pwd -P)"/* 
person Community    schedule 06.05.2009
comment
jQuery такой мощный. - person Pawel; 11.11.2013

rm  -rf * 

Не делай этого! Это опасно! УБЕДИТЕСЬ, ЧТО ВЫ В НУЖНОМ КАТАЛОГЕ!

person nkassis    schedule 04.05.2009

убедитесь, что вы находитесь в правильном каталоге

rm -rf *
person digitaljoel    schedule 04.05.2009
comment
Это не удаляет файлы или подкаталоги, имя которых начинается с точки. - person ; 04.05.2009
comment
истинный. в моем тестировании не работает rm -rf . tvanfosson имеет лучшее решение IMO с его компакт-диском ..; rm -rf ‹удалить-каталог› - person digitaljoel; 04.05.2009

Вероятно, это самое простое безопасное и общее решение:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
person devnev    schedule 04.05.2009

Я считаю, что этот ответ лучше:

https://unix.stackexchange.com/questions/12593/how-to-remove-all-the-files-in-a-directory

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

в основном вы поднимаетесь на один уровень вверх, а затем говорите, что удалите все внутри X-каталога. Таким образом, вы по-прежнему указываете, содержимое какой папки должно быть удалено, что безопаснее, чем просто сказать «удалить все здесь», сохраняя при этом исходную папку (что иногда требуется, потому что вам не разрешено или вы просто не хотите для изменения существующих разрешений папки)

person Francisco Noriega    schedule 26.10.2016