Будет ли rm -rf * удалять все файлы / папки в текущем каталоге?

32000
Olivier Lalonde

Будут ли rm -rf *удалены все файлы / папки в текущем каталоге? Я хочу убедиться, что подстановочный знак *не будет перемещаться вверх в верхних каталогах и стереть всю мою файловую систему. : D

Я помню, как делал chmod 777 .* -Rсо chmodскрытыми файлами, и это chmodотредактировало всю мою файловую систему. Очевидно, я был в учетной записи root.

20
Вот почему я должен сделать `rm -rf ./*` и явно указать текущий каталог ... но Анкур, кажется, говорит, что это все равно не имеет значения. mpen 14 лет назад 1
@Mark: в чем разница между .. и ./ ..? Вы можете попробовать cd ./ .. и посмотреть, где вы в конечном итоге :) Johan 14 лет назад 0
@Johan: нет разницы ... я думаю, это имеет больше смысла в моей сумасшедшей голове: D mpen 14 лет назад 0
@Mark: легкая ошибка сделать :) Johan 14 лет назад 0

6 ответов на вопрос

15
Benjamin Bannier

Нет, если вы не сильно настраивали свою оболочку, это не приведет к удалению файлов или каталогов, начинающихся с .. Чтобы удалить их, вы также можете перечислить их явно

rm -rf .file .dir 

или используйте правильные образцы шара (спасибо Крис)

rm -rf .[^.]* ..?* 

РЕДАКТИРОВАТЬ Суть в том, что вы не можете использовать .*для сопоставления файлов, как .file, потому что .*или .*?будет также соответствовать ..или .. .[^.]*соответствует файлам, как .file, в то время как ..?*соответствует файлам, как ..foo( *соответствует нулю или более символов, а ?соответствует ровно одному).

Вам также нужно что-то вроде `..? *`, Чтобы перехватывать записи, начинающиеся с «..» (например, `..foo`). Chris Johnsen 14 лет назад 1
@Chris: ОК, я начал это придирчивое безумие, вы правы;) Benjamin Bannier 14 лет назад 0
речь идет не только о «правильных» шаблонах глобуса, но и о количестве подходящих элементов. в каталогах с огромным количеством файлов оболочка, скорее всего, не может дать 50 тыс. файлов за один ход `rm`. Итак, удаление содержимого каталога с помощью * не самый разумный способ, imho. akira 14 лет назад 0
Я думаю, что объяснение `xargs` немного выходит за рамки этого вопроса. Например, можно подумать об этом, когда оболочка жалуется на длину списка аргументов. Benjamin Bannier 14 лет назад 0
я думаю, что это не выходит за рамки, потому что я думаю, что OP не уверен, как достичь его конечной проблемы / решения: удалить все содержимое каталога. OP просто делает общую «неправильную» вещь, имея в виду уже решение (плохое) и спрашивая, почему это решение вызывает проблемы. лучшим подходом было бы: «как удалить все файлы в каталоге, не удаляя сам каталог?» Решение ОП вызовет проблемы из-за самой природы того, как работает глобализация. akira 14 лет назад 1
@akira, чтобы избежать этой проблемы, можно [просто удалить и заново создать сам каталог] (http://superuser.com/a/379788/35237) Tobias Kienzler 12 лет назад 0
@TobiasKienzler: вы обращаетесь не к тому человеку. akira 12 лет назад 0
11
mpez0

Если вы хотите удалить каталог и все его содержимое, вы можете chdirв родительский каталог и ихrm -rf зайти в по имени, минуя весь вопрос. Если вы хотите удалить содержимое, но сохранить каталог, проще всего удалить все, а затем заново создать каталог.

Сложно придумать глобус, который будет соответствовать всем возможным сохранениям каталога. а также ..; легко придумать простой ответ (например, * .??*), который будет работать почти всегда на практике. Это нормально для интерактивного использования, так как его легко запомнить, а время, когда оно не работает, можно определить с помощью post-rm ls -a. Для сценария проще сделать удаление всех и воссоздать пустой каталог.

Вот что я бы посоветовал: выбросить каталог и сделать akira 14 лет назад 1
Даже если это не ответ, это хорошая идея. Johan 14 лет назад 0
10
Johan

Так как я думаю, что этот вопрос больше о том, что делает * (а не rm), давайте попробуем другой подход.


Если вы не уверены, что делает *, вы можете сначала «протестировать» его, используя безвредную команду, такую ​​как echo. Прежде чем запустить это, попытайтесь угадать, что они покажут, если вы запустите их в своем домашнем каталоге.

echo * echo .* 

Но сначала давайте создадим игровую площадку, чтобы мы могли поиграть со звездами и посмотреть, чем мы закончим.

mkdir ~/star_test/ cd ~/star_test/ >.file1 >file2 

Теперь в этом каталоге мы имеем это:

cj@zap:~/star_test$ ls -1a . .. .file1 file2 

Теперь обратите внимание, что * расширяется в использовании команды echo:

cj@zap:~/star_test$ echo * file2 cj@zap:~/star_test$ echo .* . .. .file1 

Итак, давайте посмотрим, что происходит с командой rm

cj@zap:~/star_test$ rm -rf * cj@zap:~/star_test$ ls -1a . .. .file1 

Как вы видите, он удалил только файл2, так как * расширился только до файла2. Если вы наберете rm -rf. *, Это будет то же самое, что и запись

rm -rf . .. .file1 

И, честно говоря, это не выглядит весело;)

Надеюсь, что это проясняет * часть вашего вопроса.


Обновление: Однако, как отмечает Ankur Goel, в rm встроена какая-то защита (довольно необычная для команд оболочки :)

Давайте создадим новую игровую площадку:

cd ~/star_test/ mkdir -p test1/test2/test3 sudo chown root.root test1 cd test1/test2/test3/ >.file1 >file2 

Итак, теперь у нас это снова, но с test1, принадлежащим root в качестве защиты, если rm начнет сходить с ума.

cj@zap:~/star_test/test1/test2/test3$ ls -a . .. file2 .file1 cj@zap:~/star_test/test1/test2/test3$ echo .* . .. .file1 

Итак, давайте удалим все:

cj@zap:~/star_test/test1/test2/test3$ rm -rf .* rm: cannot remove directory `.' rm: cannot remove directory `..' cj@zap:~/star_test/test1/test2/test3$ ls -a . .. file2 

И похоже рм не убрал. и .. даже если бы мы сказали ему !!!

Так что после этого длинного ответа оказывается безопасным удалить все в директории с помощью этого:

rm -rf * .* 

Но я бы использовал это с осторожностью, так как я не уверен, что все реализации rm ведут себя так!

7
Ankur Goel

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

1
tzot

Если вы не хотите, чтобы переместить на один уровень вверх, как mpez0 сказал и rm -rfэта конкретная папку, есть способ, чтобы работать на все каталоги / файлы, за исключением .и ..в текущей папке, выполнив:

rm -rf $(ls -A) 

Конечно, если любой из каталогов / файлов содержит один из символов в IFSспециальной переменной оболочки (например, пробел, табуляция, символ новой строки), вы можете сначала изменить IFS, запустить команду, а затем восстановить IFS.

0
Tobias Kienzler

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

cd .. rm -rf $(readlink -f yourdir) #remove the directory, treat the case of a symlink # by using readlink, to recreate the linked-to directory mkdir $(readlink -f yourdir) # recreate the directory to have it empty cd yourdir 

(Если вы используете yourdirвместо того $(readlink -f yourdir), чтобы заменить ссылку, только если исходное местоположение остается заполненным)

Это может сломать вещи, полагаясь на inode папки, и отбросить разрешения, atime / mtime / ctime / btime, расширенные атрибуты и списки контроля доступа. Daniel Beck 12 лет назад 1
@DanielBeck спасибо, хорошие моменты. Хотя мне интересно, что будет действительно полагаться на индекс, кроме жестких ссылок (на каталоги, которые в любом случае настоятельно не рекомендуются)? Но разрешения и т.д. важны. Так что в самом общем случае можно использовать `xargs` ... Tobias Kienzler 12 лет назад 0
OS X содержит механизм, который может обрабатывать файлы и папки, которые перемещаются, и при этом сохранять связь. Наиболее заметно в меню * Открыть недавние документы *. AFAICT, он использует inode для внутреннего выполнения. [Подробнее] (http://superuser.com/questions/368288/how-did-xcode-osx-do-that-moved-an-xcode-project-to-another-location-xcode-aut/368297#368297 ). Я не удивлюсь, если другие системы реализуют нечто подобное, например, в API для программ с графическим интерфейсом. Daniel Beck 12 лет назад 0

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