В Unix, как вы удаляете все в текущем каталоге и под ним? - PullRequest
106 голосов
/ 04 мая 2009

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

rm -rf <subdir-name>

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

Ответы [ 10 ]

164 голосов
/ 04 мая 2009

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

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

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

43 голосов
/ 04 мая 2009

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

find -mindepth 1 -delete

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

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

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

40 голосов
/ 04 мая 2009

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

rm -rf *

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

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

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

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

bind TAB:insert-completions
21 голосов
/ 04 мая 2009

Используйте

rm -rf *

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

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

rm -ri * 

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

6 голосов
/ 04 мая 2009

Правильно, что 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 сейчас.

5 голосов
/ 06 мая 2009

Как насчет:

rm -rf "$(pwd -P)"/* 
5 голосов
/ 04 мая 2009
rm  -rf * 

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

4 голосов
/ 04 мая 2009

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

rm -rf *
2 голосов
/ 04 мая 2009

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

find -mindepth 1 -maxdepth 1 -print0 | xargs -0 rm -rf
1 голос
/ 26 октября 2016

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

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

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

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

...