Будут ли rm -rf *
удалены все файлы / папки в текущем каталоге? Я хочу убедиться, что подстановочный знак *
не будет перемещаться вверх в верхних каталогах и стереть всю мою файловую систему. : D
Я помню, как делал chmod 777 .* -R
со chmod
скрытыми файлами, и это chmod
отредактировало всю мою файловую систему. Очевидно, я был в учетной записи root.
rm -rf ./*
и явно указал текущий каталог ... но Анкур, кажется, говорит, что это все равно не имеет значения.Ответы:
Нет, если вы не сильно настраивали свою оболочку, это не приведет к удалению файлов или каталогов, начинающихся с
.
. Чтобы удалить их, вы также можете перечислить их явноили используйте правильные образцы шара (спасибо Крис)
РЕДАКТИРОВАТЬ Суть в том, что вы не можете использовать
.*
для сопоставления файлов, как.file
, потому что.*
или.*?
будет также соответствовать..
или.
..[^.]*
соответствует файлам, как.file
, в то время как..?*
соответствует файлам, как..foo
(*
соответствует нулю или более символов, в то время как?
соответствует ровно одному).источник
..?*
перехвата записей, начинающихся с «..» (например..foo
).rm
. Итак, удаление содержимого каталога с помощью * не самый разумный способ, imho.xargs
немного выходит за рамки этого вопроса. Например, можно начать думать об этом, когда оболочка жалуется на длину списка аргументов.Если вы хотите удалить каталог и все его содержимое, вы можете зайти в
chdir
родительский каталог и указать имrm -rf
этот каталог по имени, минуя весь вопрос. Если вы хотите удалить содержимое, но сохранить каталог, проще всего удалить все, а затем заново создать каталог.Сложно придумать глобус, который будет соответствовать всем возможным сохранениям каталога. и ..; легко придумать простой ответ (например,
* .??*
), который на практике будет работать почти всегда. Это нормально для интерактивного использования, так как его легко запомнить, а время, когда оно не работает, можно определить с помощью post-rmls -a
. Для сценария проще сделать удаление всех и воссоздать пустой каталог.источник
Так как я думаю, что этот вопрос больше о том, что делает * (а не rm), давайте попробуем другой подход.
Если вы не уверены, что делает *, вы можете сначала «протестировать» его, используя безвредную команду, такую как echo. Прежде чем запустить это, попытайтесь угадать, что они покажут, если вы запустите их в своем домашнем каталоге.
Но сначала давайте создадим игровую площадку, чтобы мы могли поиграть со звездами и посмотреть, чем мы закончим.
Теперь в этом каталоге мы имеем это:
Теперь обратите внимание, что * расширяется в использовании команды echo:
Итак, давайте посмотрим, что происходит с командой rm
Как вы видите, он только удалил файл2, так как * расширился только до файла2. Если вы наберете rm -rf. *, Это будет то же самое, что и запись
И, честно говоря, это не выглядит весело;)
Надеюсь, что это проясняет * часть вашего вопроса.
Обновление: Тем не менее, как указывает Анкур Гоэль, в rm встроена какая-то защита (довольно необычная для команд оболочки :)
Давайте создадим новую игровую площадку:
Итак, теперь у нас это снова, но с test1, принадлежащим root в качестве защиты, если rm начнет сходить с ума.
Итак, давайте удалим все:
И похоже рм не убрал. и .. даже если бы мы сказали ему !!!
Так что после этого длинного ответа оказывается безопасным удалить все в директории с этим:
Но я бы использовал это с осторожностью, так как я не уверен, что все реализации rm ведут себя так!
источник
Да. Команда rm -rf удаляет только файлы и папки в текущем каталоге и не поднимается вверх по дереву файлов. rm также не будет следовать символическим ссылкам и удалять файлы, на которые они указывают, поэтому вы не можете случайно удалить другие части вашей файловой системы.
источник
Если вы не хотите , чтобы переместить на один уровень вверх , как mpez0 сказал и
rm -rf
эта папка конкретно, есть способ работы на всех каталогов / файлов , за исключением.
и..
в текущей папке, выполнив:Конечно, если какой-либо из каталогов / файлов содержит один из символов в
IFS
специальной переменной оболочки (например, пробел, табуляция, символ новой строки), вы можете сначала изменить IFS, выполнить команду, а затем восстановить IFS.источник
Гораздо более простой способ очистить всю папку, также избегая проблем «слишком много аргументов», обсуждаемых в этом ответе , состоит в простом удалении и воссоздании самого каталога. Чтобы убедиться, что это работает правильно, когда вы находитесь в каталоге с символическими ссылками, используйте следующие строки:
(Если вы используете
yourdir
вместо того$(readlink -f yourdir)
, чтобы заменить ссылку, только если исходное местоположение остается заполненным)источник
xargs
...