2

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

Есть ли способ заблокировать эту конкретную команду (rm -rf *) в Linux в C-shell или bash-shell?

В качестве альтернативы, есть ли способ, которым я могу настроить фильтр команд для ввода моей оболочки, прежде чем он перейдет в оболочку для дальнейшей обработки?

12 ответов12

5

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

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


Кроме того, канонический способ предотвратить случайное удаление - использовать alias rm="rm -i" как упомянуто в нескольких других ответах.

Экстремальные меры для экстремальных ситуаций ...

Если ваше подсознание настолько злобно, насколько это звучит, оно все равно может обойти это, используя вместо этого /bin/rm чтобы пропустить псевдоним. Для защиты от этого создайте файл с именем -i в каталогах, в которых вы часто работаете:

[me@home]$ touch -- -i
[me@home]$ ls
-i    file1.txt    file2.txt

Когда зло-вы делаете /bin/rm -rf * , подстановочный знак расширяется до списка файлов, который начинается с -i и это будет рассматриваться как опция в /bin/rm:

[me@home]$ /bin/rm -rf *
/bin/rm: remove regular empty file `file1.txt'?

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

Теперь давайте надеяться, что ваше подсознание не знает о опции -- ...

4

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

1

Все остальные предлагают использовать псевдонимы rm для rm -i . Обычно это хорошее решение. Проблема в том, что это не сработает в вашем случае. Вы всегда используете -rf после rm . Ваша команда станет rm -i -rf * , и так как -f идет после -i, она переопределит -i.

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

1

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

0

установите псевдоним для rm чтобы пройти ваш собственный скрипт. Он может проверить аргументы команды (-rf *) и вывести неприятное приглашение «ВЫ УВЕРЕНЫ?»msgstr "в противном случае он передает его молча в /usr/bin/rm или что-то ещё.

0

Это не так просто, как кажется, потому что '*' быстро разворачивается в список файлов / каталогов. alias rm=rm -i alias, вероятно, самая безопасная ставка.

0

Я предлагаю отключить rm с этим псевдонимом:

alias rm='echo "rm is disabled, use trash or /bin/rm instead."'

и использовать trash вместо rm .
(trash можно найти в пакете trash-cli в Debian/Ubuntu)

Если вам не нравится trash , вы также можете создать псевдоним

alias remove='/bin/rm -irv'

и используйте remove вместо rm .

0

Джиджи предложил «rm -i», но он будет спрашивать вас каждый раз, когда вы хотите что-то удалить.

Я предлагаю использовать 'rm -I' - прописной i - псевдоним (псевдоним rm = rm -I), цитируя страницу руководства:

          *once before removing  more  than  three  files,  or  when
          removing  recursively.  Less intrusive than -i, while still giv‐
          ing protection against most mistakes*
0

tcsh, если вы set rmstar , будет запрашивать подтверждение каждый раз, когда вы вызываете rm с аргументом * .

Конечно, это требует использования tcsh в качестве интерактивной оболочки; если вы уже используете bash, это, вероятно, недостаточно веская причина для переключения.

0

Не идеальный ответ, но делает именно то, что вам нужно в аналогичной среде. Насколько мне известно, bash не поддерживает это (по крайней мере, не через shopt).

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

От man zshoptions

RM_STAR_SILENT (-H) <K> <S>

Не запрашивайте пользователя перед выполнением rm * или rm path/* .

RM_STAR_WAIT

Если вы запрашиваете пользователя перед выполнением rm * или rm path/* , сначала подождите десять секунд и проигнорируйте все, что было введено за это время. Это позволяет избежать проблемы рефлексивного ответа « yes на запрос, хотя на самом деле это не так. Ожидание и запрос всегда можно избежать, расширяя * в ZLE (с вкладкой).

-1

Сначала cd в пустой каталог. rm -rf * будет безвредным.

-1

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

В этом случае ваша лучшая и единственная ставка - поместить псевдоним для rm в ваш .bashrc, который будет принудительно запрашивать ваши команды rm:

alias rm='rm -i'

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .