За опасностите от "rm"

click fraud protection

Дори и да сте съвсем нов в терминала, надявам се някой да ви е дал този ценен съвет:

Бъда много внимателно при използване на rm команда за премахване на файлове и папки!

Инструментът за изтриване на файлове и папки на Unix rm е една от най-опасните команди наоколо. В крайна сметка никой не обича да заличава ценни файлове случайно. Днес ще ви покажа колко опасно може да бъде и ще ви преведа през някои техники, които ще ви помогнат да работите безопасно с него.

Защо е rm потенциално опасно?

Има две основни причини, поради които трябва да уважавате и да се страхувате от rm команда. Първо, когато премахнете елемент с rm изчезва завинаги веднага щом натиснете Return. Не можете да го извадите от кофата за боклук, ако промените решението си. Да, има (малък) шанс да успеете да възстановите някои или всичките си изтрити файлове с помощта на програма на трета страна, като $90 на SubRosaSoft FileSalvage. (За да увеличите шансовете си за възстановяване на файловете, трябва да спрете да използвате вашия Mac и незабавно да стартирате помощната програма за възстановяване на файлове. Колкото по-дълго използвате своя Mac, след като сте направили грешка, толкова по-малък е шансът да възстановите данните си.) Но нека си признаем, след като

rm нещо, вероятно е отишло за добро. Hasta la vista, данни!

Втората опасност с rm е, че тъй като е Unix команда, тя е доста буквална и ще направи точно това, което е поискано - дори ако заявката означава унищожаване на същата система, която rm работи. Какво означава това? Означава, че rm е много мощен, със способността да премахва файлове от всяко място на вашата машина и тази малка печатна грешка може да доведе до много големи негативни последици. Разгледайте следния пример:

ВНИМАНИЕ: Моля, не опитвайте командата, посочена в следния пример. Ще свърши работа МНОГО ЛОШИ НЕЩА към вашата машина. Наистина ли. Наистина, много лошо. Не опитвайте това у дома. Не опитвайте това на компютъра на приятел. Не опитвайте този период. Предупреден си.

Да приемем, че сте работили върху нещо в терминала във вашата домашна папка и сте се сетили, че жена ви е искала да премахнете нещо от папката й с документи. Тя вече не се нуждаеше от папката си с работни документи, тъй като наскоро беше сменила работодателя. Като мързелив и ефективен тип хора, каквито сте, разбирате, че можете да направите това директно от терминала, без дори да променяте директории. Така че пишете:

sudo rm -rf /Потребители/съпруг/Документи/Работни документи

( -rf флаговете означават „рекурсивно ( r ) преминете през папката, като премахнете всички файлове и подпапки“ и „принудително ( f ) премахване, игнориране на разрешения.“ Ще трябва да използвате и двете опции заедно с sudo, за да премахнете папка от директорията на друг потребител.)

Звучи като добра идея, но веднага щом натиснете Return, вие задействате много бързо и много болезнено действие – току-що сте изтрили за постоянно вашите собствен Папка Документи, заедно с всичко в нея! Ех! Разбира се, имате скорошен архив (нали?!), така че това е само незначително неудобство, а не голямо бедствие. Но как се случи това и как можете да го предотвратите в бъдеще?

Какво стана?

В горния пример липсваше точно един знак – една обратна наклонена черта – и това причини опустошението. В Терминал, ако препращате към файл или папка с име, включващо интервал, вие трябва да или оградете името му в кавички, или поставете обратна наклонена черта преди интервала, както следва:

	"/Потребители/съпруг/Документи/Работни документи" /Потребители/съпруг/Документи/Работни документи	

Проблемът е, че терминалът вижда интервала във вашата оригинална команда и го интерпретира като разделител - тоест нещо, използвано за разделяне на аргументи в командния ред. И на rm команда приема множество файлове на един входен ред, както в rm файл1 файл2 файл3. В резултат на това вашият сингъл rm командата всъщност беше две команди:

	rm -rf /Потребители/съпруга/Документи/Работа rm -rf Документи	

Сега, първото rm ще се провали, ако приемем, че съпругата ви няма папка с просто име Работа в папката си с документи. Това обаче не предизвиква никакво съобщение за грешка, нито го прави rm спре да работи само защото не може да намери файла или папката, които сте посочили. Вместо това забелязва пространството и си мисли: „А, ето още една папка, която трябва да изтрия.“

Тъй като сте работили в домашната си папка и папката „Документи“ е папка от най-високо ниво в тази директория, rm команда с радост изпълнява вашите поръчки и го премахва, точно както поискахте. Пуф. Всички изчезнаха. Така или иначе наистина не се нуждаехте от дисертацията си, нали? И тъй като rm работи без никаква обратна връзка или предупреждения, няма да разберете, че нещо не е наред, докато не стане твърде късно. И всичко това, защото сте пропуснали обикновена обратна наклонена черта.

Забележка: В примера, който дадох, бихте загубили своята папка „Документи“ само ако сте работили в началната си директория или ако сте имали папка с име „Документи“ в друга папка, в която сте работили. Мисля обаче, че можете лесно да обобщите щетите, които бихте могли да причините с прости грешки.

Предотвратяване на бедствия 101

За щастие, има някои лесни стъпки, които можете да предприемете, за да се спасите от подобни бедствия. Първото, очевидно, е да бъдете изключително внимателни, когато използвате rm, особено с r (рекурсивен) и f (принудителни) опции. Но дори и с изключителна предпазливост, всички правим грешки – почти всеки, когото познавам, включително и аз, е направил поне една глупава грешка с rm. Така че отвъд здравия разум, какво друго можете да направите?

Най-безопасното решение

Освен че не използвам rm изобщо, следващото най-добро решение е да винаги използване rm -i. The опцията означава интерактивен и ви принуждава ръчно да приемете всяко изтриване. Например, ако искате да премахнете всички файлове с име, започващо с „MyPic“, ще направите следното:

	$ rm -i MyPic* премахнете MyPic1.jpg? y премахнете MyPic2.jpg? y премахнете MyPic3.jpg? y премахнете MyPic4.jpg? г	

Това наистина е най-безопасният начин за използване rm, но може да стане доста досадно – помислете за директория със 150 файла в нея, която искате да изхвърлите в кошчето. Има обаче и други решения, които осигуряват известна степен на безопасност.

Не съвсем безопасното решение

Можете също да използвате способността на обвивката да приложи аргументите от предишната команда към текущата команда. Така че вместо просто да бягате rm в папката, първо направете ls за да видите дали получавате това, което сте очаквали. Тогава кажи rm да се използват аргументите от ls команда, когато се изпълнява.

Например, ако искате да премахнете всички файлове с име, започващо с „MyPic“, можете да направите следното:

	$ ls MyPic* MyPic1.jpg MyPic2.jpg MyPic3.jpg $ rm !$	

The !$ част от тази команда казва на обвивката да вземе аргумента ( Моята снимка* ) от последната команда и го използвайте с текущата команда. В този пример това означава, че rm ще получи Моята снимка* аргумент от ls. С помощта на ls команда първо, можете да видите точно какво rm командата ще изтрие. Ако ls изходът не е правилен или извежда грешка, тогава ще видите това, преди да изтриете файловете.

Можете също така да използвате ехо команда като „суха работа“ за вашето изтриване. Вместо просто да тичам rm MyPic*, опитайте го като echo rm MyPic* първи. Резултатът ще ви покаже какво е разширено rm командата ще изглежда така:

	$ echo rm MyPic* rm MyPic1.jpg MyPic2.jpg MyPic3.jpg	

Ако всичко изглежда правилно, натиснете стрелката нагоре (за да извлечете последната команда), след това преместете курсора наляво и премахнете думата ехо.

Друг вариант, който можете да обмислите, е да не използвате rm изобщо. Вместо това използвайте командата за преместване, мв. Създайте специална папка „за изтриване“ някъде във вашата система и използвайте мв да постави всичко там на първо място. След това можете да прегледате директорията „за изтриване“, когато имате време, и да използвате rm само в рамките на тази директория—или пък я проверете от Finder и просто използвайте кошчето на Finder. Така че, за да копирате горния пример за MyPic, просто трябва да направите следното:

$ mv MyPic* ~/myuser/dump_dir/

Това ще премести всички файлове, които започват с MyPic, във вашата папка dump_dir, откъдето по-късно можете да ги разгледате в свободното си време, само за да сте сигурни, че само правилните файлове са преместени. След като сте сигурни, че правилните файлове са били преместени, можете да изтриете файловете.

Работете внимателно

Моята лична употреба на rm наистина зависи от ситуацията, но използвам комбинация от горните решения по различни начини. Едно от основните ми правила е, че се опитвам никога да не комбинирам r и f знамена със заместващия знак (звездичката). Просто има твърде много неща, които могат да се объркат. Ако трябва да направя нещо подобно, много по-вероятно е да използвам мв вместо това, или ls за да съм сигурен, че изтривам това, което възнамерявам.

Аз също ще използвам аз превключване, когато използвам заместващия знак в директория; по този начин мога да се уверя, че изтривам това, което искам да изтрия.

В края на деня наистина зависи от вас колко добре ще се защитите, когато използвате rm – това е много мощен инструмент и (особено когато се използва с sudo и рекурсивните и принудителни опции) могат да нанесат големи щети на вашата система при бързане. Няма нищо, което да докаже стойността на едно добро, текущо архивиране по-бързо от погрешно насочено rm -rf. Както Спайдърмен научи: „С голямата сила идва и голяма отговорност.“

Забележка: Тази статия беше редактирана в 9:30 сутринта тихоокеанско време в петък, 9 декември. Редакциите бяха за стил и съдържание; не са направени промени в инструкциите на Unix...

  • Apr 19, 2023
  • 7
  • 0
instagram story viewer