Это немного странно, но работы:
Вставьте фиктивный столбец как первый столбец Вашей таблицы, затем сохраните таблицу.
Наконец, удалите новый столбец и сохраните таблицу снова.
Теперь Вам, конечно, будут использовать 0 байтов.
Noel Paricollo
Один из приемов, которым я следую, - это поместить #
в начало при использовании команды rm
.
root@localhost:~# #rm -rf /
Это предотвращает случайное выполнение rm
не в том файле / каталоге. После проверки удалите #
с самого начала. Этот прием работает, потому что в Bash слово, начинающееся с #
, заставляет это слово и все оставшиеся символы в этой строке игнорироваться. Таким образом, команда просто игнорируется.
ИЛИ
Если вы хотите предотвратить любой важный каталог, есть еще одна уловка.
Создайте файл с именем -i
в этом каталоге. Как можно создать такой странный файл? Используя touch - -i
или touch ./-i[1260 impression, попробуйте
rm -rf *
:
sachin@sachin-ThinkPad-T420:~$ touch {1..4}
sachin@sachin-ThinkPad-T420:~$ touch -- -i
sachin@sachin-ThinkPad-T420:~$ ls
1 2 3 4 -i
sachin@sachin-ThinkPad-T420:~$ rm -rf *
rm: remove regular empty file `1'? n
rm: remove regular empty file `2'?
Здесь *
будет разверните -i
в командную строку, поэтому ваша команда в конечном итоге становится rm -rf -i
. Таким образом, команда запросит перед удалением. Вы можете поместить этот файл в свои /
, / home /
, / etc /
и т. Д.
ИЛИ
Используйте - preserve-root
в качестве опции для rm
. В rm
, включенном в новые пакеты coreutils
, этот параметр используется по умолчанию.
--preserve-root
do not remove `/' (default)
ИЛИ
Используйте safe-rm
Выдержка с веб-сайта:
Safe-rm - это инструмент безопасности, предназначенный для предотвращения случайного удаления важных файлов, заменив / bin / rm оболочкой, которая проверяет данные аргументы против настраиваемого черного списка файлов и каталоги, которые нельзя удалять.
Пользователи, которые пытаются удалить один из этих защищенных файлов или каталоги не смогут этого сделать, и будет показано предупреждение вместо этого сообщение:
$ rm -rf / usr Пропуск / usr
Кроме того, не в качестве меры предосторожности, а как способ узнать, какие файлы были удалены до того, как вы нажмете ^ C, вы можете использовать базу данных locate
(конечно, только если он был установлен и выжил rm
)
Я узнал об этом из этого сообщения в блоге
Некоторые псевдонимы безопасности для других команд, чтобы предотвратить подобные катастрофы, можно найти здесь :
# safety features
alias cp='cp -i'
alias mv='mv -i'
alias rm='rm -I' # 'rm -i' prompts for every file
alias ln='ln -i'
alias chown='chown --preserve-root'
alias chmod='chmod --preserve-root'
alias chgrp='chgrp --preserve-root'
Обратите внимание на верхний регистр -I
, он отличается от -i
:
запрашивать один раз перед удалением более трех файлов или при удалении рекурсивно. Менее навязчивый, чем -i, но при этом обеспечивает защиту против большинства ошибок
Если вы сейчас не в настроении приобретать новые привычки, .bashrc / .profile
- хорошее место, чтобы добавить тесты, чтобы проверить, не собираетесь ли вы сделать что-то глупое.
Я решил, что в функции Bash я могу найти шаблон, который может испортить мне день, и придумал следующее:
alias rm='set -f; myrm' #set -f turns off wildcard expansion need to do it outside of
#the function so that we get the "raw" string.
myrm() {
ARGV="$*"
set +f #opposite of set -f
if echo "$ARGV" | grep -e '-rf /*' \
-e 'another scary pattern'
then
echo "Do Not Operate Heavy Machinery while under the influence of this medication"
return 1
else
/bin/rm $@
fi
}
Хорошо, что это всего лишь Bash.
Он явно недостаточно универсален в этой форме, но Я думаю, что у него есть потенциал, поэтому, пожалуйста, оставьте несколько идей или комментариев.
Когда я удаляю каталог рекурсивно я помещаю -r
и -f
, если применимо, в конец команды, например rm / foo / bar -rf
. Таким образом, если я случайно нажму Enter слишком рано, еще не набрав весь путь, команда не будет рекурсивной, поэтому она, вероятно, безвредна. Если я нажимаю Enter при попытке ввести косую черту после / foo
, я написал rm / foo
, а не rm -rf /foo[1148745 impression.
Это хорошо работает в системах, использующих GNU coreutils, но утилиты в некоторых других Unix-системах не позволяют размещать параметры в конце таким образом. К счастью, я нечасто использую такие системы.
Ваша проблема:
Я только что случайно запустил rm -rf / *, но имел в виду rm -rf ./* (обратите внимание на звездочку после косой черты).
Решение: Не делайте этого! На практике не используйте ./
в начале пути. Косая черта не добавляет значения команде и только вызовет путаницу.
./*
означает то же самое, что и *
, поэтому приведенную выше команду лучше записать как:
rm - rf *
Вот похожая проблема. Я часто вижу следующее выражение, в котором кто-то предположил, что для FOO
установлено что-то вроде / home / puppies
. Я видел это только сегодня в документации от крупного поставщика программного обеспечения.
rm -rf $ FOO /
Но если FOO
не установлен, это будет оцениваться как rm - rf /
, который попытается удалить все файлы в вашей системе. Завершающая косая черта не нужна, поэтому на практике не используйте ее.
Следующее будет делать то же самое и с меньшей вероятностью повредит вашу систему:
rm -rf $ FOO
I я усвоил эти советы на собственном горьком опыте. Когда 14 лет назад у меня была первая учетная запись суперпользователя, я случайно запустил rm -rf $ FOO /
из сценария оболочки и уничтожил систему. Остальные 4 системных администратора посмотрели на это и сказали: «Ага. Каждый делает это однажды. Теперь вот ваш установочный носитель (36 дискет). Иди, исправь ».
Другие люди здесь рекомендуют такие решения, как - preserve-root
и safe-rm
. Однако эти решения доступны не для всех Un * xe-вариантов и могут не работать в Solaris, FreeBSD и MacOSX. К тому же, safe-rm
требует, чтобы вы устанавливали дополнительные пакеты в каждой системе Linux, которую вы используете. Если вы полагаетесь на safe-rm
, что произойдет, если вы начнете новое задание, а у него не будет установлен safe-rm
? Эти инструменты - костыль, и гораздо лучше полагаться на известные настройки по умолчанию и улучшать свои рабочие привычки.
Вы всегда можете использовать псевдоним, как вы упомянули:
what_the_hell_am_i_thinking() {
echo "Stop." >&2
echo "Seriously." >&2
echo "You almost blew up your computer." >&2
echo 'WHAT WERE YOU THINKING!?!?!' >&2
echo "Please provide an excuse for yourself below: "
read
echo "I'm sorry, that's a pathetic excuse. You're fired."
sleep 2
telnet nyancat.dakko.us
}
alias rm -fr /*="what_the_hell_am_i_thinking"
Вы также можете интегрировать его с клиентом Twitter с командной строкой, чтобы предупредить своих друзей о том, как вы чуть не унизили себя, вытирая свой жесткий диск. диск с rm -fr / *
как root.
Обычно я использую флаг -v
, чтобы увидеть, что удаляется, и имею шанс быстро ^ C
, если у меня есть малейшие сомнения. Не совсем способ предотвратить плохие rm
, но это может быть полезно для ограничения ущерба в случае, если что-то пойдет не так.
Избегайте использования подстановки . В Bash вы можете установить noglob
. Но опять же, когда вы переходите к системе, в которой noglob
не установлен, вы можете забыть об этом и действовать, как если бы это было.
Установите noclobber
, чтобы предотвратить mv
и cp
от уничтожения файлов.
Для удаления используйте файловый браузер. Некоторые файловые браузеры предлагают мусорную корзину (например, Konqueror ).
Другой способ избежать подстановки файлов - следующий. В командной строке я echo filenamepattern >> xxx
. Затем я редактирую файл с помощью Vim или vi, чтобы проверить, какие файлы должны быть удалены (следите за символами шаблонов имен файлов в файлах), а затем использую % s / ^ / rm -f /
, чтобы перевернуть каждую строку в команду удаления. Источник xxx. Таким образом, вы увидите каждый файл, который будет удален, перед тем, как это сделать.
Переместите файлы в "чердачный" каталог или архив. Или используйте контроль версий (как было сказано до меня).
Лучшие решения включают изменение ваших привычек, чтобы не использовать rm
напрямую.
Один из подходов - запустить echo rm -rf / stuff / with / wildcards *
первый. Убедитесь, что вывод подстановочных знаков выглядит разумно, затем используйте историю оболочки для выполнения предыдущей команды без echo
.
Другой подход - ограничить команду echo
случаями, когда совершенно очевидно, что вы будете удалять. Вместо того, чтобы удалять все файлы в каталоге, удалите каталог и создайте новый. Хороший метод - переименовать существующий каталог в DELETE-foo
, затем создать новый каталог foo
с соответствующими разрешениями и, наконец, удалить DELETE-foo
. Дополнительным преимуществом этого метода является то, что в вашей истории вводится команда rm -rf DELETE-foo
.
cd ..
mv somedir DELETE-somedir
mkdir somedir # or rsync -dgop DELETE-somedir somedir to preserve permissions
ls DELETE-somedir # just to make sure we're deleting the right thing
rm -rf DELETE-somedir
Если вы действительно настаиваете на удалении группы файлов, потому что вам нужно, чтобы каталог оставался ( потому что он всегда должен существовать, или потому что у вас не было бы разрешения на его воссоздание), переместите файлы в другой каталог и удалите этот каталог.
mkdir ../DELETE_ME
mv * ../DELETE_ME
ls ../DELETE_ME
rm -rf ../DELETE_ME
(Нажмите Alt + . ключ.)
Удаление каталога изнутри было бы привлекательным, потому что rm -rf.
короткий, следовательно, имеет низкий риск опечаток. К сожалению, обычные системы не позволяют этого сделать. Вместо этого вы можете использовать rm -rf - "$ PWD"
с более высоким риском опечаток, но большинство из них не приводят к удалению ничего. Помните, что это оставляет опасную команду в истории вашей оболочки.
По возможности используйте контроль версий. У вас нет rm
, вы cvs rm
или что-то еще, и это невозможно.
У Zsh есть параметры, которые могут предложить вам перед запуском rm
с аргументом, перечисляет все файлы в каталоге: rm_star_silent
(по умолчанию включено) запрашивает перед выполнением rm независимо / *
, а rm_star_wait
(по умолчанию выключено) добавляет 10- вторая задержка, в течение которой вы не можете подтвердить. Это имеет ограниченное использование, если вы намеревались удалить все файлы в каком-либо каталоге, потому что вы уже ожидаете приглашения. Это может помочь предотвратить опечатки вроде rm foo *
для rm foo *
.
Есть еще много решений, которые включают изменение команды rm
.
Решение этой проблемы - делать регулярные резервные копии. Каждый раз, когда вы создаете то, что не хотите рисковать потерять, сделайте резервную копию. Если вы считаете, что регулярное резервное копирование слишком болезненно, упростите процесс, чтобы это не было болезненным.
Например, если вы работаете с исходным кодом, используйте инструмент вроде git
, чтобы отразить код и сохранить история на другой машине. Если вы работаете с документами, используйте сценарий, который rsync
синхронизирует ваши документы с другим компьютером.
За пределами chattr
, не существует целого ряда гарантий, позволяющих root запускать такую команду. Вот почему правильные группы и осторожные команды важны при работе с привилегиями.
В следующий раз; выделите файлы, которые вы планируете удалить - опустите 'f' в rm -rf
или используйте find
и передайте его в xargs rm
Да: не работайте как root и всегда дважды подумайте, прежде чем действовать.
Также посмотрите что-нибудь вроде https://launchpad.net/safe-rm .
Мой процесс удаления на машинах с Unix выглядит следующим образом:
ls / path / to / intented / file_or_directory
в окне терминала и нажмите верните
(или Tab
, если хотите), чтобы увидеть список файлов. Если все в порядке,
нажмите кнопку стрелку вверх
, чтобы открыть ls / path / to / intented / file_or_directory
из истории терминала снова.
замените ls
на rm
или rm -r
или rm -rf
, если требуется. Я лично не люблю использовать флаг -f
.
Этот процесс проверки также предотвращает преждевременное выполнение команды rm
, что случилось со мной до того, как я начал следить за этим процессом.
Поскольку это на «Serverfault», я хотел бы сказать следующее:
Если у вас есть десятки или больше серверов, с большой командой администраторов / пользователей, кто-то направляется в rm -rf
или chown
неправильный каталог.
У вас должен быть план восстановления затронутой службы с наименьшим возможным средним временем восстановления.
Это мой стандарт специально для регулярных выражений в контексте rm, но в этом случае он бы вас спас.
Я всегда делаю echo foo * / [0- 9] * {bar, baz} *
сначала, чтобы увидеть, чему будет соответствовать регулярное выражение. Получив результат, я возвращаюсь к редактированию в командной строке и меняю echo
на rm -rf
. Я никогда, никогда не использую rm -rf
для непроверенного регулярного выражения .
Это может быть сложно, но вы можете настроить роли в SELinux, чтобы даже если пользователь становится пользователем root через sudo su - (или простой su), возможность удаления файлы могут быть ограничены (вы должны войти в систему напрямую как root, чтобы удалить файлы). Если вы используете AppArmor, вы можете сделать что-то подобное .
Конечно, другим решением будет убедиться, что у вас есть резервные копии. :)
Одним из важных факторов, позволяющих избежать ошибок такого типа, является отказ от входа в систему с использованием учетной записи root. Когда вы входите в систему с использованием обычного непривилегированного пользователя, вам необходимо использовать sudo
для каждой команды. Так что будьте осторожнее.
Хе-хе (непроверено и несколько шутливо!):
$ cat /usr/local/bin/saferm
#! /bin/bash
/bin/ls -- "$@"
echo "Those be the files you're about to delete."
echo "Do you want to proceed (y/N)?"
read userresponse
if [ "$userresponse" -eq "y" ]; then
echo "Executing...."
/bin/rm -- "$@"
fi
А затем:
alias rm="/usr/local/bin/saferm"
На самом деле, вы должны сделать мысленную паузу перед выполнением такого рода операции с глобусом, независимо от того, запускается от имени root, добавляя к нему "sudo" и т. д. Вы можете запустить "ls" для того же глобуса и т. д., но мысленно вы должны остановиться на секунду, убедиться, что вы набрали то, что хотели, сделать уверен, что то, что вы хотите, на самом деле то, что вы хотите, и т.д. плита может быть горячей.
И убедитесь, что у вас есть хорошие резервные копии!
Похоже, что лучший способ снизить этот риск - это использовать двухэтапное удаление, как в большинстве графических интерфейсов пользователя. То есть замените rm чем-то, что перемещает вещи в корзину (на том же томе). Затем очистите этот мусор, когда пройдет достаточно времени, чтобы заметить любую ошибку.
Одна такая утилита, trash-cli, обсуждается на Unix StackExchange, здесь .
В этой ветке есть действительно плохие советы, к счастью, большинство из них было отклонено.
Прежде всего, когда вам нужно быть root , станьте root - sudo, и различные уловки с псевдонимами сделают вас слабее. И что еще хуже, они сделают вас неосторожным. Научитесь делать все правильно, перестаньте полагаться на псевдонимы, чтобы защитить вас. Однажды вы получите root-права на коробке, у которой нет ваших тренировочных колес, и что-нибудь взорвете.
Во-вторых, когда у вас есть root-права, представьте себя водителем автобуса, полного школьников. Иногда ты можешь раскачиваться под песню по радио,
Просто используйте ZFS для хранения файлов, которые вам нужны, чтобы противостоять случайному удалению, и иметь демон, который:
Если файлы были удалены, перезаписаны, повреждены, что угодно, просто откатите файловую систему до клона последнего удачного снимка, и все готово .
Самый простой способ предотвратить случайное rm -rf / *
- это полностью отказаться от использования команды rm
! На самом деле, у меня всегда было искушение запустить rm / bin / rm
, чтобы полностью избавиться от команды! Нет, я не шучу.
Вместо этого используйте параметр -delete
команды find
, но сначала, прежде чем удалять файлы, я рекомендую предварительно просмотреть, какие файлы вы будет удалено:
find | less
Обратите внимание, что в современных версиях find
, если вы не укажете имя каталога, он будет неявно использовать текущий каталог, поэтому приведенное выше эквивалентно:
find . | less
Убедившись, что это файлы, которые вы хотите удалить, вы можете добавить параметр -delete
:
find path/to/files -delete
Таким образом, не только find
безопаснее использовать,
ليس إجابة كثيرًا ولكن نصيحة ، أفعل دائمًا rm (dir) -rf
لا rm -rf (dir)
أي: لا تذهب نوويًا حتى آخر لحظة ممكنة.
فهي تساعد في التخفيف من المواقف التي تضغط فيها على اسم dir بحيث يظل حذفًا صالحًا ، مثل الانزلاق والضغط على مفتاح الدخول.
للأسف ، لا يمكنني ترك تعليق أعلاه بسبب عدم كفاية الكارما ، لكني أردت تحذير الآخرين من أن Safe-rm ليست دواءً سحريًا لكوابيس الحذف الجماعي العرضي.
تم اختبار ما يلي في جهاز ظاهري Linux Mint 17.1 (تحذير لمن ليسوا على دراية بهذه الأوامر: لا تفعل ذلك! في الواقع ، حتى أولئك الذين يعرفون هذه الأوامر يجب / ربما لن يفعلوا ذلك أبدًا لتجنب فقدان البيانات الكارثي):
نسخة نصية ( مكثف):
$ cd /
$ sudo safe-rm -rf *
$ ls
bash: /bin/ls: No such file or directory
إصدار صورة (ممتلئ):
Мне нравится оконный подход к мусорной корзине.
Обычно я создаю каталог с именем "/tmp/recyclebin" для всего, что мне нужно удалить:
mkdir /tmp/recyclebin
И никогда не использую rm -rf, я всегда использую:
mv target_folder /tmp/recyclebin
Затем позже я опустошаю мусорную корзину с помощью скрипта или вручную
.Я думаю, что это мощный совет по предотвращению с помощью * ярлыка расширения в оболочке:
Сначала введите rm -rf *
или rm -rf your / path / *
, НЕ вводите Введите ключ
. (конечно, вы должны иметь привычку не нажимать Enter быстро / случайно при использовании rm -rf
)
Затем нажмите Alt-Shift-8
(т.е. Alt-Shift - *
) для явного расширения подстановочного знака «*» в bash. Это также позволит избежать повторного ввода команды «rm -rf *» при навигации по истории.
Наконец, после проверки расширения, есть правильные файлы / каталоги, нажмите Enter.
Готово.
В случае, если это поможет кому-то в его собственном случае:
rmsafe
:Он перемещает файлы в "мусорную" папку, и у вас всегда есть возможность вернуть их обратно с помощью простого mv
:
$ rmsafe /path/to/important/files
Source: https://github.com/pendashteh/rmsafe
safe
:Вы можете установить псевдоним для rm
, используя safe:
$ alias rm="safe rm"
Теперь, если вы запустите rm /*
, вы получите это в ответ:
$ rm /*
Are you sure you want to 'rm /bin /boot /data /dev /etc /home /initrd.img /lib /lib64 /mnt /opt /proc /root /run /sbin /srv /sys /tmp /usr /var'? [y/n]
и я полагаю, что вы не наберете y
!
Я просто написал свой собственный сценарий, который может просто предупреждать и запрашивать подтверждение для любого типа ситуации, только вам решать, как его улучшить
#!/bin/sh
# just sudo mv /usr/bin/rm to /usr/bin/rm-original
path=${!#}
color_yel="\x1b[1;33m"
color_rst="\x1b[0m"
function get_yn() {
read i
if [ "$i" != "y" ]; then echo "aborted."; exit 1; fi
}
if [ -d ${path} ]; then
echo -e "${color_yel}You are deleting a folder, it's potentially dangerous, are you sure (y/n) ?${col>
get_yn
/usr/bin/rm-original $@
fi
Дальнейшая идея по улучшению:
Таким образом, простой настраиваемый скрипт позволяет иметь любое особое поведение и избегать установки дополнительных пакетов.
Обладая некоторыми знаниями о bash, вы можете удалять только определенные вещи.