Почему rm не работает рекурсивно по умолчанию?

Я обсуждал с другом, пытаясь выяснить, почему команда rm, например, не проверяет, является ли путь к файлу или папке автоматически, и при необходимости по умолчанию удаляет его рекурсивно. Все время без необходимости использовать "-r" для довольно распространенной задачи. Я знаю, что могу поставить для этого псевдоним. Но на самом деле я хочу знать причину (я думаю, что она существует, просто не знаю).

-2
17.10.2016, 22:49
3 ответа

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

Ведь обычный rm тоже небезопасен. И не обязательно даже безопаснее, поскольку разные файлы не являются одинаково важными или незаменимыми. Что бы вы предпочли удалить: каталог, клонированный с Github с флагом -r или /boot/vmlinuz* без опции -r.

С rm вы стреляете себе в ногу. Но с rm -r вы стреляете в каждую ногу, которую видите, и если вам повезет, ни одна из этих ног не окажется вашей собственной.

А rm -r делает нечто совершенно иное, чем обычный rm, он должен отвязать(2) каждый файл, идущий по дереву, а затем rmdir(2) пустые каталоги.

0
28.01.2020, 05:17

О действительной причине вы должны спросить автора (ов). Я могу только сказать вам, что это очень хорошая практика:

Из статьи в Википедии о железнодорожном пневматическом тормозе :

Система Westinghouse использует давление воздуха для зарядки резервуаров (баков) воздуха на каждой машине. Полное давление воздуха дает сигнал каждой машине отпустить тормоза. Снижение или потеря давления воздуха дает сигнал каждой машине задействовать тормоза, используя сжатый воздух в своих резервуарах.

Это означает, что по умолчанию тормоз включен. Вам нужно усилие, чтобы освободить его и привести поезд в потенциально опасное состояние.

Конечно, это не объясняет, почему существуют два режима rm (рекурсивный и нерекурсивный). Может быть, это то, о чем вы спрашиваете. Тем не менее, сделать более безопасный вариант по умолчанию было правильным решением.

1
28.01.2020, 05:17

A fileне то же самое, что directory, и не то же самое, что block or character device file, pipe, semaphoreи т. д....

rmудаляет файл (обычный, устройство, включенные каналы ), однако

rmdirудаляет каталог.

rm-по умолчанию каталог не удаляется.

rmdir-по умолчанию не будет удаляться не -пустой каталог.

rm -d-заставляет rm принимать как каталог, так и файл, но удаляет только пустой каталог (, как иrmdir).

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

rmdir -p a/b/cудаляет каталог и его родителей, но каталог удаляется только в том случае, если он пуст. Учитывая структуру каталогов a/b/c, команды rmdir -p a/b/cи rm -r aпочти обратны, за исключением того, что rm -rудалит непустой каталог, rmdirбудет жаловаться.

Это дает нам довольно гибкую систему для работы.

Ничто не мешает вам создать собственный псевдоним,

`псевдоним ZapIt='rm -r $ *'

mkdir -p a/b/c ; touch a/b/c/fc1
ZapIt a

удалит a/b/c/fc1 a/b/c a/b и a.

0
28.01.2020, 05:17

Теги

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