20

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

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

6 ответов6

15

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

rm -rf .file .dir

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

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

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

12

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

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

10

Так как я думаю, что этот вопрос больше о том, что делает * (а не 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

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

1

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

rm -rf $(ls -A)

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

0

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

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) вы замените ссылку, только если исходное местоположение заполнено)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .