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


108

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

rm -rf <subdir-name>

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


2
Это должно быть обман: stackoverflow.com/questions/550922/…
jmucchiello

Ответы:


166

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

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

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


8
Почему это безопаснее?
Йена

34
Потому что вы специально сопоставляете именованный каталог и, следовательно, с меньшей вероятностью удалите то, что вы не собираетесь удалять.
tvanfosson

5
Правда. Я видел, что делаю это довольно легко.
Йена

26
не удаляет ли он и сам каталог? После этого вы должны выполнить mkdir <dir-to-remove>. Но тогда любая жесткая ссылка, относящаяся к этому каталогу, впоследствии станет отдельным каталогом.
Йоханнес Шауб - лит

5
@Yen, если вы используете, rm ./вы можете случайно набрать, rm . /что может привести к катастрофе.
irfandar

44

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

find -mindepth 1 -delete

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

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

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


Мне нужно было удалить все файлы в подкаталогах, но я не хотел удалять сами подкаталоги. find <name-of-direcotry> -mindepth 2 -delete отлично работает!
Тим Дирборн

Вам нужно, -mindepth 1если вы указываете каталог ( find <name-of-directory> -mindepth 1 -delete). В противном случае Йоханнес прав, он не удалит текущий рабочий каталог (при использовании find -delete).
Weboide

ИМО, это лучший ответ, особенно в скриптах.
wizonesolutions

1
Я пробовала: find -mindepth 1 -deleteно у меня получилось, illegal option -- mно она отлично сработала, когда я удалил опцию find . -delete
mindepth

41

Я всегда печатаю

rm -rf *

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

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

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

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

bind TAB:insert-completions

Отсутствует --в этом ответе? Я должен сказать, что в целом такой подход потрясающий.
Ben Voigt

лучший способ - запустить это с помощью sudo
Аббас Тораби,

22

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

rm -rf *

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

Более безопасная версия IMO должна использовать:

rm -ri * 

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


13
«Может быть рискованно» - замечательно лаконично.

5
Когда я делал подобные вещи, я быстро нашел команду ls -r. first позволяет увидеть, что вы собираетесь удалить. Полезно, чтобы быстро понять, что вы не собираетесь удалять весь диск ...
Рич Брэдшоу,

2
Почему это более рискованно, чем rm -rf <subdir-name>?
Йена

2
@Yen - потому что, если вы сделаете это не в том месте, вы можете получить плачевные результаты. Использование определенного имени в неправильном месте может пойти не так, только если там есть тот же подкаталог.
tvanfosson

1
Вы не можете удалить родителя, находясь в ребенке.
осторожно,

6

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

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

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

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

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

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


6

Как насчет:

rm -rf "$(pwd -P)"/* 

27
jQuery настолько мощный.
Павел

5
rm  -rf * 

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


4

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

rm -rf *

2
При этом не удаляются файлы или подкаталоги, имена которых начинаются с точки.

1
правда. в моем тестировании rm -rf тоже. tvanfosson имеет лучшее решение IMO с его "cd ..; rm -rf <dir-to-remove>"
digitaljoel

2

Это простейшее безопасное и общее решение, вероятно:

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf

1

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

/unix/12593/how-to-remove-all-the-files-in-a-directory

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.