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

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

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

20
задан 18.03.2012, 21:02

5 ответов

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

rm -rf .file .dir

или используйте правильные шаблоны шарика (благодарит Chris),

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

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

15
ответ дан 07.12.2019, 10:09

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

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

12
ответ дан 07.12.2019, 10:09

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

7
ответ дан 07.12.2019, 10:09

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


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

echo *
echo .*

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

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

Теперь в этом dir у нас есть это:

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

Теперь заметьте то, что * разворачивает в использование команды эха:

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

Поэтому давайте посмотрим то, что происходит с командой комнаты

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

Поскольку Вы видите, что он действительно только удалял file2, с тех пор * только расширенный до file2. Если бы Вы ввели бы комнату-rf.*, который совпал бы с записью

rm -rf . .. .file1

И честно говоря, которые не выглядят забавными ;)

Надежда это разъясняется * часть Вашего вопроса.


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

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

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

Таким образом, теперь у нас есть это снова, но с test1, принадлежавшим корню как защита, если комната начинает приходить в бешенство.

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

И похоже, что комната не удалила. и.. даже если мы сказали ему!!!

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

rm -rf * .*

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

10
ответ дан 07.12.2019, 10:09

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

rm -rf $(ls -A)

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

1
ответ дан 07.12.2019, 10:09

Теги

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