поскольку я думаю, что этот вопрос больше о том, что * делает (а не rm), давайте попробуем другой подход.
если вы не уверены, что делает, вы можете "проверить" сначала с помощью безобидная команда, как эхо.
Прежде чем запустить это, попробуйте угадать, что они покажут, если вы запустите их в своем домашнем каталоге.
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
а если честно, то выглядят не весело;)
надеюсь, это проясняет * часть вашего вопрос.
обновление:
Однако, как указывает Анкур Гоэль, в rm встроена какая-то защита (необычная для команд оболочки :)
давайте создадим новую игровую площадку:
cd ~/star_test/
mkdir -p test1/test2/test3
sudo chown root.root test1
cd test1/test2/test3/
>.file1
>file2
Итак, теперь у нас это снова, но с test1, принадлежащим root, в качестве защиты, если
РМ начинают сходить с ума.
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 не удалялась . и. . даже если бы мы ему сказали!!!
таким образом, после этого длинного ответа оказывается безопасным удалить все в dir с этим:
rm -rf * .*
но я бы использовал это с осторожностью, так как я не уверен, что все реализации rm ведут себя так!