Намерение:
rm -rf string*
Проблема:
rm -rf string *
Первый случай - законное и распространенное использование rm, во втором случае небольшая опечатка может вызвать много проблем. Есть ли простой способ разумной защиты от случайного трейлинга или лидирующего символа подстановки?
zsh
илиbash
) я бы предпочел нажать клавишу табуляции (чтобы вызвать автозаполнение), прежде чем нажимать клавишу возвратаtouch -- -i
создаст файл,-i
который будет передан вrm
качестве параметра-i
при включении подстановочного знака в ваши аргументы.rm *
. Если вы напечатаетеrm name *
, он расширится доrm name -i other names
.-i
не будет обрабатываться как опция, потому что это не перед именами файлов.Ответы:
DEBUG
Ловушка может быть написана для отмены команды , которые выглядят подозрительно. Следующее или похожий на него код можно добавить к вашему~/.bashrc
:Отрегулируйте логику по вкусу.
(На самом деле я не ожидаю, что этот подход будет полезным - слишком много способов деструктивно испортить команду, чтобы найти их тестирование один за другим - но он дает буквальный ответ на вопрос).
источник
Там нет никакого способа, чтобы полностью пуленепробиваемые системы. И добавив "Вы уверены?" подсказки к вещам и контрпродуктивны и приводят к «Конечно, я уверен». коленные реакции.
Уловка, которую я взял из книги прошлых лет, состоит в том, чтобы сначала сделать
ls -R blah*
то, что делать,rm -fr blah*
если и только если список, который появился, достиг того, что я хотел ударить.ls
Сначала достаточно просто выполнить команду, затем ↑удалитьls -R
и заменить наrm -fr
.Последний вопрос: «Если информация была полезна для вас, где ваша резервная копия?»
источник
^ls -R^rm -rf^
и, возможно, установить в качестве псевдонимаls -R
, что я в основном делаю все время, но это настолько инстинктивно, что в этот момент мое сознание ускользнуло, когда я сформировал ответ. Так что +1 за это.cat > .log
, затем возвращаюсь и вставляю или дергаю имя файла перед.log
. Так что ни в коем случае я не имею> valuablefile
на cmdline.rm -i
, поэтому я часто просто сочиняю свою команду rm, а затем помещаю a\
в начале строки. (\rm
избегает расширения псевдонимов для rm, так как часть слова была заключена в кавычки). Если мне нужно были-r
или-f
, да , я иногда начинаю сls
вместоrm
или просто уйти от в-rf
части. (Отредактируйте, как вы получаете форматирование кода с обратной косой чертой? bquote bslash bslash bquote не удается.Можете ли вы научить себя использовать, скажем,
rmrf
вместоrm -rf
?Если это так, эта функция bash предоставит вам шанс увидеть, что на самом деле произойдет, прежде чем подтвердить команду:
Чтобы сделать эту функцию постоянной, добавьте эту строку в
~/.bashrc
файл на каждом используемом компьютере.Сравнение с общим
rm
псевдонимомОбычно называют псевдоним:
Это имеет два ограничения:
Если вы зависите от этого псевдонима, то вы будете шокированы, когда находитесь на машине или в среде, где ее нет. Напротив, попытка запустить
rmrf
на машине без этой функции вернет безвредностьcommand not found
.Этот псевдоним не поможет в вашем случае, потому что
-f
параметр, который вы указали в командной строке, переопределяет-i
параметр в псевдониме.источник
rm -rf
команду, что происходит? Создание подобных псевдо-функций в конечном итоге просто усложняет простое решение: просто будьте осторожнее и понимайте, что такое разрешения.rmrf
, в отличие от простого создания функции оболочки,rm
которая проверяет аргументы-r
или-rf
, и в этом случае применяет специальную логику, в противном случае напрямую вызываяcommand rm "$@"
для вызова реальнойrm
команды?-f
если у вас его нет-i
. Отключение-f
дает вам дополнительное предупреждение, например, перед удалением файла только для чтения.Если я нахожусь в ситуации , когда удаление бракованных файлов является действительно большим делом, одна из вещей , которые я сделал , это сделать мусорную корзину папки, как
mkdir trashcan
и тогда у меня есть сценарий ,rmTrashcan
который имеетrm -rf trashcan/*
илиrm -rf *
или подобные, написанную очень тщательно и проверил несколько раз.Таким образом, если я сделаю ошибку, ошибка будет в
mv
команде, а не вrm
команде. Как только я сделаюls
и уверен в том, что именно я удаляю, онrmTrashcan
действительно выполняет грязную работу безопасно.Это также было чрезвычайно удобно для ситуации, когда мне приходилось удалять резервные копии. Я мог
mv
целый месяц создавать резервные копии в мусорной корзине,mv
немногие я хотел сохранить (1-е число, 15-е число) обратно в резервные копии, а затемrmTranshcan
остальные. Выполнение подобной команды сложно выполнитьrm
самостоятельно, и выполнение этого таким образом позволило мнеls
быть уверенным в том, какие файлы я оставляю (вместо того, чтобы просто перечислять файлы, которые я намереваюсь удалить).источник
Вместо того, чтобы возиться с двумя командами (
ls
иrm
), я думаю, что проще и проще использоватьfind
:Если вы случайно наберете текст,
"string *"
он удалит файлы с именамиstring chars
иstring letters
(что в любом случае вам и нужно), но он не будет захватывать каждый файл, как*
в оболочке.Кроме того, вы можете пропустить,
-delete
чтобы увидеть, какие файлы он собирается удалить, затем нажать стрелку вверх и набрать-delete
текст легче, чем набирать текст^ls -R^rm -rf
или другие глупости.источник
find
выполнит вложенный поиск файлов, которые совпадают, а не только с явными параметрами, объявленными в командной строке. Я думаю, что это не соответствует цели. Хотя я могу ошибаться.На самом деле, нет. В другом ответе предлагается, что вы можете создать собственную команду для добавления приглашения перед выполнением задачи. Но проблема этой пользовательской команды в том, что она должна быть сознательно установлена в системах, над которыми вы работаете. И даже если он установлен, проблема заключается в том, что ваш рефлекс, с помощью которого
y
можно выполнить задание, может войти в игру.Это означает, что это все проблема пользовательского интерфейса, даже если он находится на уровне текстовой / командной строки. Сколько сетей безопасности вы ожидаете, чтобы защитить вас от того, что вы не должны делать? Это как ножницы: если вы как-то небрежны, поскользнулись и порезали руку, намереваясь порезать ткань или бумагу, кто виноват? Или даже светофоры и стоп-сигналы: на самом деле ничто не мешает водителю включить свет или игнорировать дорожные знаки, кроме острой осведомленности о том, что может случиться, если они действительно будут вести себя так рискованно.
Тем не менее, лучшее, реалистичное решение заключается в системных правах доступа пользователей и групп. Это лучшая / единственная реальная сеть безопасности для защиты пользователя от себя.
Если вы работаете в системе, где вы единственный, кто имеет к ней доступ, у вас может возникнуть соблазн всего
chmod 777
, но это не тот способ, которым настроена рациональная система. Вместо этого права доступа должны быть такими же, как755
для всех каталогов и644
для всех неисполняемых файлов. Исполняемые файлы должны быть755
как минимум, но, возможно, даже744
если вы хотите, чтобы другие читали, но не запускали файлы.источник
Попробуйте составить исходную
rm
команду без-f
флага, но-i
вместо этого с таким,rm
который предложит вам для каждого файла, который он намерен удалить. Для небольших рекурсивных удалений вы можете удерживать yклавишу, если вы уверены, что команда была введена правильно. Для больших удалений вы можете прервать операцию и использовать историю командной строки, чтобы аккуратно изменить на-i
a-f
.источник
y[RETURN]
каждый файл, с GNU rm вы ничего не сможете удержать. Редактирование-i
- это путь, когда вы правильно набрали команду. Тогда вы получите приглашение только для файла, доступного только для чтения, и, возможно, других вещей.rm -I
чтобы он запрашивал только один раз и только для потенциально опасных удалений (т.У rm есть
-i
и-I
флаги для подтверждения перед каждым удалением. В прошлом некоторые дистрибутивы включали их по умолчанию. Это ужасная идея. Дайте пользователю слишком много диалогов подтверждения для обычных операций, и они начнут их обычное подтверждение. Это просто сдвигает требование «быть осторожным» (всегда красным флажком) в новый и более раздражающий диалог. "Да. Да. Да. Да! ДА! Черт возьми, тупой компьютер, просто удалите файлы ДА-ДЕС-ДЕС-ДЕС - ХЛОПОТ Я НЕ ЗНАЮ! Это проблема диалога «Да, но я имел в виду нет». Этот ответ дает наглядное объяснение того, почему диалоги подтверждения приходят не вовремя.Тип ошибки, которую вы описываете, - это промах , «выполнение действия, которое не было тем, что было задумано». Пользователь обычно сразу распознает ошибку и точно знает, как ее исправить. К сожалению, Unix не дает пользователю возможности, rm немедленно удаляет файл. Любая другая операционная система решает эту проблему, позволяя удалять, по крайней мере, на некоторое время, с помощью корзины.
Существуют различные системы мусора для Unix, и этот ответ полон предложений .
Вопрос в псевдониме rm или нет в псевдониме rm. Плюсы для алиасинга рм ...
Минусы для псевдонимов ...
Если вы будете следовать первому аргументу слишком далеко, вы будете использовать vi (не vim, vi), csh (не tcsh, csh) и другие устаревшие утилиты, потому что они доступны повсеместно. Тем не менее, существует опасность перенастройки вашей среды. Я предпочитаю брать с собой свои коммунальные услуги и делать это как можно проще. YMMV.
Два и три являются техническими проблемами. Они могут быть решены с помощью умного жнеца, который проверяет размер мусора и периодически убирает вещи, как в случае с жнецом . Это может быть задание cron или более умная версия, в которой можно использовать различные инфраструктуры событий файловой системы, доступные во многих дистрибутивах Linux для настольных компьютеров. Это не просто, а еще сложнее сделать эффективно. Лучше найти существующую систему, чем пытаться создать собственную.
С четвертым можно справиться, сделав ваш новый rm псевдонимом оболочки
alias rm='trash'
, тогда это не повлияет на программы.Пятая проблема, которую я оставляю читателю для решения. У rm не так много переключателей.
источник
rm -i
, но я часто использую его,\rm
чтобы получить беспристрастное поведение. Я печатаюrm -i
каждый раз, когда планирую сказать «нет» одному из аргументов. Иногда я запускаю команду сls
помощью команды, а затем вставляю \ rm только после завершения. Так что я никак не могу случайно нажать «вернуться»rm -rf /
вместо/.../file
rm -I
илиrm --interactive=once
это намного, гораздо менее раздражает, чемrm -i
, и все еще ловит что-то опасное (оно только выдает запрос, когда существует более 3 файлов, или если это рекурсивно, и только ОДИН РАЗ вместо ФАЙЛА ДЛЯ КАЖДОГО ФАЙЛА.)-i
может дать пользователю время для изменения целей. Этот ответ на связанный вопрос выкладывается.rm -i
более 30 секунд, не выключив его. Принимая во внимание, чтоrm -I
только подсказывает, когда есть вероятность, что вы облажались; приглашение появляется только для больших удалений. Когда вы пытались удалить несколько вещей и выдается приглашение, вы ошеломлены и понимаете, что случайно набрали «foo *».-rf
мною обнаруженным мною) - плохие прокси для обнаружения вероятного сбоя. Желание удалить подкаталог вряд ли облажается. Сообщение не помогает, потому что оно только подтверждает, что пользователь сказал делать, не добавляя полезную информацию в тот момент, когда пользователь не хочет проверять. msgstr "rm: удалить 1 аргумент рекурсивно?" "Да, удалите каталог, я только что сказал вам сделать это! ... подождите, какой каталог это был? CRAP !!!"Я учу всех о
!$
= последнем аргументе в последнем трюке команды:Это позволяет проверить расширение подстановочного знака, а затем использовать точно такой же шаблон глобуса без возможности вставки пробела перед
*
.Также я предлагаю, чтобы люди никогда не вырезали и не вставляли шаблон с подстановочными знаками в потенциально разрушительную командную строку. Потому что в моих руках это было проблемой :)
Техник в моей лаборатории только что сделал эту ошибку на прошлой неделе (3 месяца работы) - и да, у нас была резервная копия (1 день позади).
источник
Кажется, все говорят: «Будь осторожнее», «Не делай подсказок с псевдонимом / подтверждением, потому что ты привык не обращать на это должного внимания».
Круто и все. Я имею в виду, я не думаю, что вы должны сделать псевдоним для
rm
(ниrmrf
, поскольку вы могли бы легко облажаться и набрать настоящую команду).Но почему вы не можете создать псевдоним / скрипт и, скажем, вызвать его и указать
remove
только один аргумент (например, $ 1)? Подстановочный знак должен быть $ 2 из-за непреднамеренного пробела (amiright?), И, таким образом, ваш скрипт / оболочка / псевдоним не будет передан второму. Да, вы можете делать только один набор удалений (с подстановочным знаком), но это цена, которую вы заплатите.Если бы я писал что-то приятное, я мог бы попросить сообщить мне количество файлов и каталогов, которые он планирует удалить, и общий размер удаляемых материалов, а затем попросить подтверждения, но это может помешать вашему потоку. Может быть, сделать эту опцию флага
remove
? (-я). Вы также можете сделать проверку $ 1, чтобы увидеть, является ли это просто одним подстановочным знаком, и запросить подтверждение, и указать, в каком каталоге вы на самом деле находитесь.Кроме того, существует ряд
rm
замен. Многие пытаются быть совместимыми с мусором рабочего стола пользовательского интерфейса. Некоторые из них, возможно, стоит изучить.источник
remove \*
? Если ваш сценарий позволяет оболочке глобально расширять свой ввод, я не вижу, чтобы это сильно помогало.В
-rf
конце очень простой трюк :rm whatever* -rf
это значительно снижает частоту появления ошибок, потому что вы набираете больше символов после
*
, и у вас больше времени, чтобы увидеть опечатки.Это не все решает. Просто простой ежедневный трюк.
источник