Есть `да | rm -r `безопаснее, чем `rm -rf `?

Если я вас правильно понял, вы хотите:

awk -F"," 'BEGIN{OFS=","} 
           {
            if (NR==FNR) {
                a[$1]=$3; 
                next
            } 
            if ($2 in a){
                $1=a[$2]
            }
             print
           }' data.csv file1.csv

Вы были почти там. Вам просто нужно установить $1как то, что вы сохранили из первого файла, а затем распечатать строку.

23
29.08.2021, 10:00
7 ответов

Во-первых, как уже говорили другие, yes | rm -rочень похоже, но не идентично rm -rf. Отличие состоит в том, что опция -fуказывает rmпродолжать после различных ошибок. Это означает, что yes | rm -rзавершится при первой ошибке, в отличие от rm -rf, которые продолжают работу и продолжают удалять все, что могут. Это означает, что yes | rmнемного менее опасен, чем rm -f, но не существенно.

Итак, что вы делаете, чтобы снизить риски rm?

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

Не используйте интерактивную корневую оболочку. . Это сразу усложняет выполнение наихудшего -случая rm -rf /. Вместо этого всегда используйте sudo, что должно быть визуальной подсказкой, чтобы внимательно посмотреть на команду, которую вы вводите. Если абсолютно необходимо запустить корневую оболочку, сделайте там то, что вам нужно, и выйдите. Если что-то заставляет вас быть root большую часть времени, исправьте это.

Будьте осторожны с абсолютными путями. Если вы обнаружите, что вводите путь, начинающийся с /, остановитесь. Безопаснее избегать абсолютных путей и вместо этого перейти к каталогу, из которого вы собираетесь удалить, использовать lsи pwd, чтобы осмотреться, чтобы убедиться, что вы находитесь в правильном месте, а затем продолжить.

Сделайте паузу перед нажатием возврата в команде rm. Я приучил себя всегда всегда отрывать пальцы от клавиатуры после ввода любой rmкоманды (и нескольких других потенциально опасных команд ), очень внимательно проверять то, что я набрал, и только затем снова кладу пальцы на клавиатуру и нажимаю «возврат».

Используйте echo rm..., чтобы увидеть, что вы просите rmсделать. Я часто выполняю важные rmкоманды в два -шага. Сначала я набираю

$ echo rm -rf...

это расширяет все шары оболочки (т. е. *шаблоны,etc )и показывают мне команду rm, которая должна была быть выполнена. Если это выглядит хорошо, снова после тщательной проверки я набираю^P(control -P ), чтобы вернуть предыдущую строку ввода, удаляю echoи снова проверяю командную строку, затем нажимаю «Ввод», ничего не меняя..

Создавайте резервные копии. Если вы делаете большую часть из вышеперечисленного, шансы на восстановление всей системы очень малы, но вы все равно можете случайно удалить свои собственные файлы, и удобно иметь возможность откуда-то вернуть их.

27
30.08.2021, 07:56

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

Разница между rm -rf dirи yes | rm -r dirзаключается в том, что -fпереопределяет подсказки для начала, в то время как конвейер из yesотвечает yна все подсказки. Что, вероятно, будет воспринято как подтверждение удаления, но на него должна влиять локаль (LC_MESSAGES), поэтому может быть так, что в какой-то локали yне подтвердится. (Я тестировал Debian в финской локали, где подтвердились и английский y, и финский k.)

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

Я не думаю, что это относится только к rmили к командной строке в целом. Вполне возможно щелкнуть «удалить» не тот файл или каталог в файловом менеджере на основе графического интерфейса -.

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

Если вам все еще нужно это сделать, вы можете включить rmв функцию, которая подсчитывает и составляет список затронутых файлов, прежде чем приступить к удалению. Но сделать это - другой вопрос.

9
29.08.2021, 20:44

Нетyes | rm -rне безопаснее, чем rm -rf.

В все его измерения.

Основная команда Unix для стирания файла — rm. Существуют и другие команды, которые также могут стереть файл, например, отменить связь. Однако unlinkработает только с одним файлом и не может отменить связь с каталогом (в Linux ).

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

Но это также опасная команда, так как она обладает большой силой.
С большей силой приходит большая ответственность.


Это не не очень хорошая идея, чтобы попытаться ограничить такую ​​команду на вашем компьютере, чтобы меньше стирать файлы или использовать псевдонимы,(rm -i)которые уменьшают опасность, она может имеют. Потому что при этом ты привыкаешь к другому уровню защиты, своего рода помощнику. Это может звучать разумно. Но подумайте об этом :вы ssh к другому компьютеру или сидите на другом компьютере, чтобы помочь, у которого нет такого дополнительного барьера, и вы даете команду, уверенный, что ничего важного не произойдет, но это происходит.

Мое слово мудрости (моя личная точка зрения ):

  • привыкните к такой опасности, будьте осторожны каждый раз, когда используете команду rm, и в долгосрочной перспективе вам будет лучше.
4
29.08.2021, 23:07

С практической точки зрения :если вы создаете временный рабочий каталог в сценарии и хотите удалить его в конце, используйте фиктивный файл для защиты от собственных ошибок кодирования (большинство из нас были укушены этими):

tmdir=...
mkdir -p "$tmpdir"
touch "$tmpdir/.my-removable"
...
...
! [ -e "$tmpdir/.my_removable" ] || rm -rf "$tmpdir"
1
30.08.2021, 08:08

Это бессмысленно. Если вы просто хотите, чтобы rmне спрашивал о каждом файле, не используйте -iв первую очередь. например. отключите расширение псевдонима для этой команды, выполнив\rm -r foobar. (Заключение одного или нескольких символов команды с помощью \или одинарных/двойных кавычек, очевидно, отключает сопоставление псевдонимов в bash. )Затемrmбудет по-прежнему запрашивать любые файлы -только для чтения (и несколько других особых случаев ), поскольку это значение по умолчанию. Только если вы хотите переопределить это, вы должны использовать -f.

Или, лучше, не используйте псевдоним rm='rm -i'в первую очередь, потому что вы слишком привыкли всегда нажимать yпри удалении даже одного файла, нарушая большую часть цели безопасности проверяйте и тратьте время.

GNU rm(1)также имеет-I(--interactive=once)опцию(справочную страницу)для всей команды при удалении более 3 файлов или если вы использовали -r. Это спасает вас от совпадения глобусов гораздо больше, чем должно, и позволяет вам убедиться, что подсчет выглядит как правильное количество файлов для преднамеренных больших глобусов.

Я считаю, что это хороший баланс в качестве стандартного rmпсевдонима, хотя иногда я все еще использую -fдля переопределения его для каталогов с большим количеством файлов только для чтения -, где он будет задавать несколько вопросов. Это нормально, хотя, поскольку это редкий случай для меня.

напр.

### example on Arch GNU/Linux, GNU Coreutils 8.32

$ alias rm
alias rm='rm -I'

$ touch foo{1..3}
$ rm -r  *foo* 
rm: remove 3 arguments recursively? ^C
$ rm  *foo*           # silently works
$ touch foo{1..4}
$ rm  *foo* 
rm: remove 4 arguments? y

$ touch foo{1..4}
$ chmod 444 foo1
$ rm  *foo* 
rm: remove 4 arguments? y
rm: remove write-protected regular empty file 'foo1'? y       # same prompt as \rm *foo*


$ mkdir dfoo dbar
$ touch foo{1..4}
$ rm  *foo* 
rm: remove 5 arguments? y
rm: cannot remove 'dfoo': Is a directory      # but the regular files got deleted

$ touch foo{1..4}
$ rm -r foo[1-3]
rm: remove 4 arguments recursively? n
       # prompts because of -r, not actually checking for directories

$ rm -r *foo* dbar
rm: remove 6 arguments recursively? y
    # files and directories all gone, one prompt.

Если я когда-нибудь захочу, чтобы поведение интерактивно выбирало, какой из нескольких файлов, соответствующих глобусу, удалить, я явно использую rm -i *foo*или что-то в этом роде. -ion по умолчанию имеет смысл для mvи cp, где во многих случаях использования -ничего не уничтожается, но не для rm.

Другие методы обеспечения безопасности:

  • При вводе команды, включающей rm -r, начните с llили lsвместо rm, затем вернитесь назад и отредактируйте ее, чтобы «взять на охрану» команду, т. е. снять предохранитель. (управление -а,alt -d в bash, чтобы перейти к началу строки и убить -назад -слово.)
  • В общем, избегайте опасной строки в командной строке на тот случай, если вы -нажмете клавишу ввода в любой момент. например. не вводите rm -r ~/some/dirв таком порядке, потому что вы не хотите rm -r ~/someвсе дерево. Начните с ls -d, особенно при использовании шаблонов, особенно если шаблон не находится в конце строки, где завершение табуляции -может легко показать вам расширения. Или просто пропустите -rf. (В GNU rmвы можете размещать параметры в любом месте командной строки, в том числе в конце ).
  • Не полагайтесь на rm -iпсевдоним -когда-нибудь вы будете использовать оболочку без псевдонимов (в оболочке восстановления, или через SSH, или при загрузке с USB в режиме реального времени ). Было бы отстойно нажимать return в команде, ожидая, что она спросит вас, какой из файлов на самом деле удалить, и чтобы этого не произошло. Если вы планируете сказать nнекоторым файлам, явно используйте -i. И сделайте привычкой смотреть / думать, прежде чем нажимать клавишу возврата на rmв любом каталоге, который вы не можете -сгенерировать тривиально.
6
30.08.2021, 20:17

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

В последнее время я использовал find /path -name whatever -ls, затем !! -delete, используя механизм подстановки истории оболочки. Это дает тот же «предварительный просмотр», что и ввод rmс помощью echo, но легче (и, следовательно, более надежен )для ввода.

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

Я использовал alias rm='rm -i'в течение моего первого года использования Unix (давным-давно ). Затем однажды мне удалось удалить не тот файл, потому что мои пальцы настолько привыкли печатать rm... y, что у меня не было времени подумать и воздержаться от этого.

Я немедленно удалил псевдоним и обязался быть более осторожным в будущем. И хотя я не могу сказать, что с тех пор никогда не удалял неправильный файл, это было гораздо более редким случаем, чем когда-то -в -году, когда я начал, так что в целом я было бы лучше удалить этот псевдоним. Первая строка моего ~/.bashrcбыла unalias rm cp ln mvс тех пор, как какой-то системный администратор решил, что «для безопасности» псевдоним должен быть добавлен к /etc/bashrc.

Знание того, что это опасно, держит меня настороже и поэтому защищает меня.

И отвечать на ваш вопрос:yes | rm -riболее опасно, потому что это создает иллюзию большей безопасности, хотя на самом деле подвергает вас тем же рискам. На самом деле есть небольшие различия в рисках, потому что он работает немного медленнее, давая вам больше времени, чтобы прервать его, и в ограниченных обстоятельствах прервется и остановится, но на самом деле,который полностью заглушается эффектом «иллюзии безопасности».

0
31.08.2021, 21:25

Я всегда опускаю -rf до последнего и мысленно запрограммировал себя на то, чтобы воспринимать его ввод как сигнал к тому, чтобы «теперь хорошенько подумать». Кроме того, подумайте, что может произойти, если кто-то случайно нажмет CR преждевременно.

тип

rm./foo -rf

думаю "удалить foo, я абсолютно уверен, что там нет ничего, что мне нужно, я абсолютно уверен, куда я попал, да, -rf, CR."

Я часто труслю и сначала делаю find./foo, чтобы увидеть, что будет уничтожено, и, конечно, можно снова использовать findс -delete.

0
01.09.2021, 12:58

Теги

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