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

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

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

20
задан gadgetmo 2010-04-02 05:16:08
источник

6 ответов

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

rm -rf .file .dir

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

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

редактировать дело в том, что вы не можете использовать .* для сопоставления файлов типа .file, потому что .* или .*? также будет соответствовать .. или .. .[^.]* соответствует файлам типа .file, а ..?* соответствует файлам типа ..foo (* соответствует нулю или более символов, в то время как ? соответствует ровно один).

15
отвечен Benjamin Bannier 2010-04-02 11:40:59
источник

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

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

11
отвечен mpez0 2010-04-02 15:37:50
источник

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


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

echo *
echo .*

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

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

теперь в этом реж мы есть это:

[email protected]:~/star_test$ ls -1a
.
..
.file1
file2

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

[email protected]:~/star_test$ echo *
file2
[email protected]:~/star_test$ echo .*
. .. .file1

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

[email protected]:~/star_test$ rm -rf *
[email protected]:~/star_test$ ls -1a
.
..
.file1

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

rm -rf . .. .file1

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

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


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

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

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

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

[email protected]:~/star_test/test1/test2/test3$ ls -a
.  ..  file2  .file1
[email protected]:~/star_test/test1/test2/test3$ echo .*
. .. .file1

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

[email protected]:~/star_test/test1/test2/test3$ rm -rf .*
rm: cannot remove directory `.'
rm: cannot remove directory `..'
[email protected]:~/star_test/test1/test2/test3$ ls -a
.  ..  file2

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

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

rm -rf * .*

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

10
отвечен Johan 2010-04-06 09:26:04
источник

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

7
отвечен Ankur Goel 2010-04-02 05:26:50
источник

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

rm -rf $(ls -A)

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

1
отвечен tzot 2010-05-10 01:00:37
источник

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

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

0
отвечен Tobias Kienzler 2017-03-20 13:16:51
источник

Другие вопросы shell globbing

X