Как стать автором
Обновить

Комментарии 36

$ mkdir -p wtf/why_so_serios
$ touch wtf/why_so_serios/-i
$ rm -rf wtf
$ ls
$
ЧЯДНТ?
> mkdir -p important-dir/{-i,1,2,3}
> cd important-dir/
> rm -rf *
rm: remove directory `1'?
Вы не видите разницы в водимых командах?\
Команда упомянутая топикастером практически не применяется в реальной жизни… Если уж человек решил удалить всё содержимое каталога, то зачем ему оставлять саму папку (а именно это делает команда rm -rf folder/*)? Все нормальные люди пишут rm -rf folder и тут уже спасет только как заметили ниже chattr, а в BSD еще есть и модные флаги (эх хочу такие в Linux) которые работают на уровне ФС и даже root ни чего не удалит.
Потому что:
rm -rf * .tmp

Всего один лишний пробел)
Ну или
rm -rf folder/ *

Опять же с лишним пробелом)
а в BSD еще есть и модные флаги (эх хочу такие в Linux)

$ uname -a
Linux host 2.6.39-1-amd64 #1 SMP Tue May 24 14:34:19 UTC 2011 x86_64 GNU/Linux
$ touch unremovable
$ su -c 'chattr +i unremovable'
Password:
$ rm unremovable
rm: remove write-protected regular empty file `unremovable'? y
rm: cannot remove `unremovable': Operation not permitted
$ su -c 'rm unremovable'
Password:
rm: cannot remove `unremovable': Operation not permitted
НЛО прилетело и опубликовало эту надпись здесь
Вообще для таких вещей создан chattr.
Особенно рулит +a, если вы часто путаете ">" и ">>".
Ну и да:
inky@laptop1:~/test$ ls 1/
-i
inky@laptop1:~/test$ ls 2/
-i
inky@laptop1:~/test$ rm -r 1/
inky@laptop1:~/test$ rm -rf 2/
inky@laptop1:~/test$ ls
3 4 -i
>если вы часто путаете ">" и ">>".

… то в zsh есть адская технология, которая ругается при попытке перезаписать файл через > в интерактивном шелле
Как раз месяц назад поставил себе вместо bash zsh…
% echo qq > test
% echo qqq > test
% cat test
qqq
%
тишина…
>Как раз месяц назад поставил себе вместо bash zsh…

осталось его два года настраивать.

можете начать с setopt NOCLOBBER
НЛО прилетело и опубликовало эту надпись здесь
Полностью согласен. Только это не команда создана, а дополнительные атрибуты файловой системы extX. Т.е. на других файловых системах свои дополнительные атрибуты и эта команда не сработает.
А так — да, chattr +i и даже рут не сможет удалить файл или директорию пока не снимет атрибут, или +a если в файл надо писать.
Для избежания путаницы с >> и > рекомендую вот это:

set -o noclobber

из man bash:
If the redirection operator is >, and the noclobber option to the set builtin has been enabled, the
redirection will fail if the file whose name results from the expansion of word exists and is a reg‐
ular file. If the redirection operator is >|, or the redirection operator is > and the noclobber
option to the set builtin command is not enabled, the redirection is attempted even if the file
named by word exists.
MacPro$ mkdir test
MacPro$ touch test/-i
MacPro$ rm -rf test
MacPro$ ls
MacPro$

Макось тоже не с вами
> Одна простая вещь

Какое содержательное название топика. Ведь по нему так удобно будет потом искать!
Use favorites, Luke
Думаю лучше так:
alias rm='rm -i'
Нет, так не лучше, как нам уже десятки лет намекает виндовс. Если система на каждое удаление задаёт один и тот же вопрос, рано или поздно пользователь сначала ответит “да”, а потом задумается что же он натворил.
Бедные скрипты. Точнее тот, кто скриптами будет пользоваться.
alias'ы не работают в скриптах.
ну только если вы в ша-банге не укажете #!/bin/bash -i.
Да, точно. Впрочем, постоянные вопросы на удаление не есть хорошо.
а потому что правильно писать «rm — *» или «rm important-directory/*» — в таких записях «файлы-флаги» не сработают, а будут пониматься как обычные файлы.
Упс, в команде rm имелось в виду два дефиса перед *
rm -- *
а файл защитить можно атрибутом «неизменяемый»
пример как установить
chattr +i /etc/resolv.conf

посмотреть
lsattr /etc/resolv.conf

пример как снять
chattr -i /etc/resolv.conf
В топике не хватает Капитана Очевидности, который расскажет, что -i — это параметр для команды rm, который говорит о том, что нужно запрашивать подтверждение перед удалением, а * — это такой символ, который не передается в команду rm, а разворачивается командной оболочкой (например, bash) в список всех файлов. В результате имя файла -i для rm воспринимает как параметр. Но любое изменение записи команды rm делает эту хитрость нерабочей, например rm -rf ./*
Автор слишком хотел написать самый короткий пост, поэтому его не все поняли.
Вы просто завидуете что у меня короче! :)
> Вы просто завидуете что у меня короче! :)

Вы сделали мой день!

> Вы просто завидуете что у меня короче! :)

Мужики достали и померялись!
НЛО прилетело и опубликовало эту надпись здесь
Это самый короткий топик-перевод, который я видел.
Надо было сделать еще короче:

Одна простая вещь

man chattr
тогда уж:

Одная простая вещь

man
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории