Eu apenas corri rm -rf /*
acidentalmente, mas eu quis dizer rm -rf ./*
(observe a estrela após a barra).
alias rm='rm -i'
e, --preserve-root
por padrão, não me salvou; existem salvaguardas automáticas para isso?
Eu não era root e cancelei o comando imediatamente, mas havia algumas permissões relaxadas em algum lugar ou algo porque notei que meu prompt do Bash já havia sido quebrado. Não quero depender de permissões e não ser root (eu poderia cometer o mesmo erro sudo
), e não quero procurar bugs misteriosos por causa de um arquivo ausente em algum lugar do sistema; portanto, faça backups e sudo
seja bom , mas gostaria de algo melhor para este caso específico.
Sobre pensar duas vezes e usar o cérebro. Estou usando na verdade! Mas estou usando-o para resolver algumas tarefas complexas de programação envolvendo 10 coisas diferentes. Estou imerso nesta tarefa profundamente o suficiente, não há poder cerebral sobrando para verificar bandeiras e caminhos, nem sequer penso em termos de comandos e argumentos, penso em termos de ações como 'dir de corrente vazia', uma parte diferente do meu cérebro os traduz em comandos e, às vezes, comete erros. Quero que o computador os corrija, pelo menos os perigosos.
rm -rf . /mydir
vez derm -rf ./mydir
matar o diretório em que estava. Acho que isso acontece com mais frequência.rm
não é uma arma, é um programa de computador, pode ser inteligente o suficiente para determinar que o usuário excluirá alguns arquivos importantes e emitirá um aviso (como realmente acontece se você tentar ficarrm -rf /
sem estrela).rm
comando é uma pergunta de administrador de sistemas perfeitamente legítima.Respostas:
Um dos truques que sigo é colocar
#
no começo enquanto estiver usando orm
comandoIsso impede a execução acidental
rm
no arquivo / diretório errado. Depois de verificado, remova#
do início. Esse truque funciona, porque no Bash uma palavra que começa com#
faz com que essa palavra e todos os caracteres restantes nessa linha sejam ignorados. Portanto, o comando é simplesmente ignorado.OU
Se você deseja impedir qualquer diretório importante, há mais um truque.
Crie um arquivo nomeado
-i
nesse diretório. Como pode ser criado um arquivo tão estranho? Usandotouch -- -i
outouch ./-i
Agora tente
rm -rf *
:Aqui o
*
expandirá-i
para a linha de comando, para que seu comando se torne finalmenterm -rf -i
. Assim, o comando solicitará antes da remoção. Você pode colocar esse arquivo na sua/
,/home/
,/etc/
, etc.OU
Use
--preserve-root
como uma opção pararm
. Norm
incluído noscoreutils
pacotes mais recentes , esta opção é o padrão.OU
Use safe-rm
Trecho do site:
fonte
-i
arquivo. Hah. Festa boba.touch -- -rf
Seu problema:
A solução: não faça isso! Por uma questão de prática, não use
./
no início de um caminho. As barras não agregam valor ao comando e causam apenas confusão../*
significa a mesma coisa que*
, portanto, o comando acima é melhor escrito como:rm -rf *
Aqui está um problema relacionado. Vejo a expressão a seguir com frequência, em que alguém supõe que
FOO
está definido como algo parecido/home/puppies
. Eu vi isso hoje, na verdade, na documentação de um grande fornecedor de software.rm -rf $FOO/
Mas se
FOO
não estiver definido, será avaliado comorm -rf /
, o que tentará remover todos os arquivos do seu sistema. A barra final é desnecessária, portanto, por uma questão de prática, não a use.O seguinte fará a mesma coisa e é menos provável que corrompa seu sistema:
rm -rf $FOO
Eu aprendi essas dicas da maneira mais difícil. Quando tive minha primeira conta de superusuário há 14 anos, executei acidentalmente
rm -rf $FOO/
um script de shell e destruí um sistema. Os outros quatro administradores de sistemas olharam para isso e disseram: 'Sim. Todo mundo faz isso uma vez. Agora, aqui está sua mídia de instalação (36 disquetes). Vá consertar.Outras pessoas aqui recomendam soluções como
--preserve-root
esafe-rm
. No entanto, essas soluções não estão presentes para todos os variantes Un * xe e podem não funcionar no Solaris, FreeBSD e MacOSX. Além disso,safe-rm
requer a instalação de pacotes adicionais em todos os sistemas Linux que você usa. Se você confiarsafe-rm
, o que acontece quando você inicia um novo trabalho e ele não estásafe-rm
instalado? Essas ferramentas são uma muleta e é muito melhor confiar nos padrões conhecidos e melhorar seus hábitos de trabalho.fonte
rm -rf *
. Ele sempre altera o diretório primeiro e usa um destino específico. O motivo é que ele usa muito o histórico do shell e está preocupado que esse comando possa aparecer na hora errada.rm -rf *
também era removido.
e..
. Eu era root e isso atravessou os diretórios inferiores../../..
, e foi bastante destrutivo. Eu tento ter muito cuidado com issorm -rf *
desde então.rm -rf $FOO
não vai ajudar se você precisarrm -rf $FOO/$BAR
.cd $FOO && rm -rf $BAR
vai ajudar, embora seja muito mais longo.${FOO:?}
, como emrm -rf ${FOO:?}/
erm -rf ${FOO:?}/${BAR:?}
. Isso impedirá que ele se traduzarm -rf /
. Tenho mais algumas informações sobre isso na minha resposta aqui .rm -rf *
um loop for que mudou para o diretório errado por engano e acabou excluindo outra coisa. Se eu tivesse usado um alvo específico, teria uma chance muito menor de excluir a coisa errada.Como está em "Serverfault", gostaria de dizer o seguinte:
Se você tiver dezenas ou mais servidores, com uma grande equipe de administradores / usuários, alguém está acessando
rm -rf
ouchown
o diretório errado.Você deve ter um plano para recuperar o serviço afetado com o menor MTTR possível.
fonte
As melhores soluções envolvem mudar seus hábitos para não usar
rm
diretamente.Uma abordagem é executar
echo rm -rf /stuff/with/wildcards*
primeiro. Verifique se a saída dos curingas parece razoável e use o histórico do shell para executar o comando anterior sem oecho
.Outra abordagem é limitar o
echo
comando aos casos em que é óbvio o que você excluirá. Em vez de remover todos os arquivos em um diretório, remova o diretório e crie um novo. Um bom método é renomear o diretório existente paraDELETE-foo
, criar um novo diretóriofoo
com as permissões apropriadas e finalmente removê-loDELETE-foo
. Um benefício colateral desse método é que o comando inserido no seu histórico érm -rf DELETE-foo
.Se você realmente insistir em excluir um monte de arquivos porque precisa que o diretório permaneça (porque ele sempre deve existir ou porque você não tem permissão para recriá-lo), mova os arquivos para um diretório diferente e exclua esse diretório .
(Pressione a tecla Alt+ .).
Excluir um diretório de dentro seria atraente, porque
rm -rf .
é curto, portanto, tem um baixo risco de erros de digitação. Infelizmente, os sistemas típicos não permitem que você faça isso. Você pode, emrm -rf -- "$PWD"
vez disso, com um risco maior de erros de digitação, mas a maioria deles leva à remoção de nada. Cuidado que isso deixa um comando perigoso no seu histórico de shell.Sempre que puder, use o controle de versão. Você não
rm
, vocêcvs rm
ou o que quer, e isso é desfazível.O Zsh tem opções para avisá-lo antes de executar
rm
com um argumento que lista todos os arquivos em um diretório:rm_star_silent
(ativado por padrão) solicita antes da execuçãorm whatever/*
erm_star_wait
(desativado por padrão) adiciona um atraso de 10 segundos durante o qual você não pode confirmar. Isso é de uso limitado se você pretende remover todos os arquivos em algum diretório, porque já estará esperando o prompt. Pode ajudar a evitar erros de digitação, comorm foo *
pararm foo*
.Existem muitas outras soluções que envolvem a alteração do
rm
comando. Uma limitação dessa abordagem é que um dia você estará em uma máquina com o realrm
e ligará automaticamenterm
, seguro na expectativa de uma confirmação ... e em seguida estará restaurando os backups.fonte
mv -t DELETE_ME -- *
é um pouco mais infalível.rm
diretamente é um bom conselho! Uma alternativa ainda melhor é usar ofind
comando .find somedir -type f -delete
que excluirá todos os arquivos,somedir
mas deixará o diretório e todos os subdiretórios.Você sempre pode fazer um alias, como você mencionou:
Você também pode integrá-lo a um cliente de twitter da linha de comando para alertar seus amigos sobre como você quase se humilhou limpando seu disco rígido
rm -fr /*
como root.fonte
telnet miku.acm.uiuc.edu
?Sim: não trabalhe como raiz e sempre pense duas vezes antes de agir.
Além disso, dê uma olhada em algo como https://launchpad.net/safe-rm .
fonte
A maneira mais simples de evitar acidentes
rm -rf /*
é evitar todo o uso dorm
comando! Na verdade, sempre fui tentado a correrrm /bin/rm
para me livrar completamente do comando! Não, eu não estou sendo ridículo.Em vez disso, use a
-delete
opção dofind
comando , mas primeiro antes de excluir os arquivos, recomendo visualizar quais arquivos você estará excluindo:Observe que, nas versões modernas,
find
se você deixar de fora o nome de um diretório, ele implicitamente usará o diretório atual; portanto, o acima é o equivalente a:Depois de ter certeza de que esses são os arquivos que você deseja excluir, adicione a
-delete
opção:Portanto, além de ser
find
mais seguro de usar, também é mais expressivo ; portanto, se você deseja excluir apenas determinados arquivos em uma hierarquia de diretórios que correspondam a um padrão específico, use uma expressão como essa para visualizar e exclua os arquivos:Existem muitas boas razões para aprender e usar,
find
além de apenas uma maneira mais segurarm
, então você se agradecerá mais tarde se dedicar algum tempo para aprender a usarfind
.fonte
Há alguns conselhos realmente ruins nesse segmento, felizmente a maioria deles foi rejeitada.
Antes de tudo, quando você precisar ser root, torne-se root - sudo e os vários truques de alias o deixarão fraco. E pior, eles vão te deixar descuidado. Aprenda a fazer as coisas da maneira certa, pare de depender dos pseudônimos para protegê-lo. Um dia, você enraizar-se-á numa caixa que não tem rodinhas e explodirá algo.
Segundo - quando você tiver raízes, pense em si mesmo como dirigindo um ônibus cheio de crianças em idade escolar. Às vezes você pode ouvir a música no rádio, mas outras vezes precisa olhar para os dois lados, desacelerar as coisas e verificar todos os seus espelhos.
Terceiro - Você quase nunca realmente tem que
rm -rf
- mais provável que você quermv something something.bak
oumkdir _trash && mv something _trash/
Quarto - sempre o
ls
seu curinga antesrm
- Não há nada louco em ver algo antes de destruí-lo para sempre.fonte
ls
.find
comando .find . -name '*~'
exemplo. O quels
quero dizer é que listará a mesma glob querm
será usada.Esse é o meu padrão especificamente para regexps no contexto de rm, mas teria salvado você nesse caso.
Eu sempre faço
echo foo*/[0-9]*{bar,baz}*
primeiro, para ver o que o regexp vai corresponder. Depois de obter a saída, volto com a edição da linha de comando e mudoecho
pararm -rf
. Eu nunca, nunca usorm -rf
em uma regexp não testada .fonte
*
tem uma definição muito precisa chamada Kleene Star, que é um operador unário que corresponde a zero ou mais elementos do conjunto ao qual é aplicado (no caso de expressões regulares, o caractere ou conjunto de caracteres que precede o Kleene Star), enquanto, ao observar as*
correspondências, qualquer coisa no padrão a seguir. Eles são semanticamente muito diferentes, mesmo que pareçam ter uma sintaxe semelhante.A solução para esse problema é fazer backups regulares. Sempre que você produz algo que não quer arriscar perder, faça o backup. Se você achar que fazer backup regularmente é muito doloroso, simplifique o processo para que não seja doloroso.
Por exemplo, se você trabalha com código-fonte, use uma ferramenta semelhante
git
a espelhar o código e manter o histórico em outra máquina. Se você trabalha com documentos, tenha um script que sejarsync
seus documentos para outra máquina.fonte
Parece que a melhor maneira de reduzir esse risco é ter uma exclusão em dois estágios, como a maioria das GUIs. Ou seja, substitua rm por algo que move as coisas para um diretório da lixeira (no mesmo volume). Em seguida, limpe o lixo após um tempo suficiente para perceber qualquer erro.
Um desses utilitários, trash-cli, é discutido no Unix StackExchange, aqui .
fonte
rm
.Um fator importante para evitar esse tipo de erro é não fazer login usando a conta root. Quando você efetua login usando o usuário não privilegiado normal, você precisa usar
sudo
para cada comando. Então, você deve ter mais cuidado.fonte
sudo
e os backups. Dê uma olhada nesta página: forum.synology.com/wiki/index.php/… . Ele fala sobre a criação de uma lixeira. Espero que isto ajude!Quando excluo um diretório recursivamente, coloco o
-r
, e-f
se aplicável, no final do comando, por exemplorm /foo/bar -rf
. Dessa forma, se eu acidentalmente pressionar Enter muito cedo, sem ter digitado o caminho inteiro ainda, o comando não será recursivo, portanto é provavelmente inofensivo. Se eu pressionar Enter ao tentar digitar a barra depois/foo
, escrevi emrm /foo
vez derm -rf /foo
.Isso funciona muito bem em sistemas que usam os GNU coreutils, mas os utilitários em alguns outros Unixes não permitem que opções sejam colocadas no final dessa maneira. Felizmente, não uso esses sistemas com muita frequência.
fonte
Pode ser complicado, mas você pode configurar funções no SELinux para que, mesmo que o usuário se torne root via sudo su - (ou su simples), a capacidade de excluir arquivos possa ser limitada (você deve fazer login diretamente como root para remover arquivos). Se você estiver usando o AppArmor, poderá fazer algo semelhante .
Obviamente, a outra solução seria garantir que você tenha backups. :)
fonte
Evite usar globbing . No Bash, você pode definir
noglob
. Mas, novamente, quando você muda para um sistema ondenoglob
não está definido, você pode esquecer isso e continuar como se estivesse.Defina
noclobber
para impedirmv
ecp
destruir arquivos também.Use um navegador de arquivos para exclusão. Alguns navegadores de arquivos oferecem uma lixeira (por exemplo, Konqueror ).
Outra maneira de evitar o globbing é a seguinte. Na linha de comando, eu
echo filenamepattern >> xxx
. Em seguida, edito o arquivo com o Vim ou vi para verificar quais arquivos devem ser excluídos (observe os caracteres padrão do nome do arquivo nos nomes de arquivos.) E depois uso%s/^/rm -f/
para transformar cada linha em um comando de exclusão. Fonte xxx. Dessa forma, você vê todos os arquivos que serão excluídos antes de fazê-lo.Mova os arquivos para um diretório ou sótão 'sótão'. Ou use o controle de versão (como dito antes de mim).
fonte
find
comando .O ZSH me pergunta (como padrão) antes de executar a
rm -rf *
.fonte
Fora
chattr
isso, não há muitas salvaguardas de permitir que o root execute esse comando. É por isso que grupos adequados e comandos cuidadosos são importantes ao executar privilégios.Próxima vez; escopo dos arquivos que você planeja excluir - omita 'f' de
rm -rf
ou usefind
e passe-o paraxargs rm
fonte
find
, mas recomendo uma maneira mais segura de usá-lo na minha resposta . Não há necessidade de usar,xargs rm
pois todas as versões modernas dofind
têm a-delete
opção . Além disso, para usar com segurança,xargs rm
você também precisará usáfind -print0
-xargs -0 rm
lo; caso contrário, terá problemas ao encontrar coisas como nomes de arquivos com espaços.find
é uma boa sugestão; no entanto, as nuances dexargs
são importantes se você sugerir usá-lo; caso contrário, isso gera confusão e frustração ao encontrar arquivos com espaços (o que é evitado usando a-delete
opção).Alguns aliases de segurança para outros comandos, para evitar desastres semelhantes, encontrados aqui :
Observe que as maiúsculas
-I
são diferentes de-i
:fonte
Normalmente, uso o
-v
sinalizador para ver o que está sendo excluído e tenho a chance de^C
rapidamente, se tiver a menor dúvida. Não é realmente uma maneira de evitar mausrm
's, mas isso pode ser útil para limitar o dano no caso de algo correr mal.fonte
Meu processo de exclusão em máquinas baseadas em Unix é o seguinte.
ls /path/to/intented/file_or_directory
na janela do terminal e pressionereturn
(ouTab
, conforme desejado), para ver a lista de arquivos.Se tudo parece bom,
clique na
up arrow
tecla para recuperarls /path/to/intented/file_or_directory
o histórico do terminal.substitua
ls
porrm
ourm -r
ourm -rf
, conforme necessário. Eu, pessoalmente, não gosto de usar-f
bandeira.Esse processo de validação também impede a execução prematura do
rm
comando, algo que aconteceu comigo, antes de começar a seguir esse processo.fonte
find
que explico na minha resposta .Se você não está com disposição para adquirir novos hábitos agora,
.bashrc/.profile
é um bom lugar para adicionar alguns testes para verificar se você está prestes a fazer algo estúpido. Eu imaginei que em uma função Bash eu poderia receber um padrão que poderia arruinar o meu dia e surgiu com isso:O bom disso é que é apenas o Bash.
Claramente, não é genérico o suficiente nesse formulário, mas acho que tem potencial, por isso, poste algumas idéias ou comentários.
fonte
find
comando . Além disso, não entendo por que você diz "o bom disso é que é apenas o Bash"? É recomendável evitar bash-isms em scripts .set -f
que é equivalenteset -o noglob
no Bash, mas isso ainda não explica sua afirmação de que "o lado bom disso é que é apenas o Bash". Em vez disso você pode eliminar totalmente o problema e de uma forma genérica para qualquer shell por não usarrm
em tudo, mas sim usando ofind
comando . Você já tentou essa sugestão para ver como ela se compara ao que você sugere aqui?Infelizmente, não posso deixar um comentário acima devido ao carma insuficiente, mas queria alertar outras pessoas de que a empresa segura não é uma panacéia para pesadelos acidentais com exclusão em massa.
O seguinte foi testado em uma máquina virtual Linux Mint 17.1 (aviso para aqueles que não estão familiarizados com esses comandos: Na verdade, até mesmo aqueles que estão familiarizados com esses comandos nunca deveriam / provavelmente nunca faria isso para evitar perda de dados catastrófica):
Versão em texto (condensada):
Versão da imagem (completa):
fonte
Eu gosto da abordagem das janelas da lixeira.
Normalmente, crio um diretório chamado "/ tmp / recyclebin" para tudo o que preciso excluir:
E nunca use rm -rf, eu sempre uso:
Depois, esvazio a lixeira usando um script manualmente ou manualmente.
fonte
Hehe (não testado e um tanto ridículo!):
E depois:
Realisticamente, você deve fazer uma pausa mental antes de executar esse tipo de operação com um glob, esteja executando como root, acrescentando "sudo" a ele etc. Você pode executar um "ls" no mesmo glob etc. mas, mentalmente, você deve parar por um segundo, verifique se digitou o que queria, verifique se o que deseja é realmente o que deseja etc. Suponho que isso é algo que é aprendido principalmente pela destruição de algo no primeiro ano como Unix SA, da mesma maneira que o queimador de calor é um bom professor, dizendo que algo no fogão pode estar quente.
E verifique se você tem bons backups!
fonte
Além disso, não como uma salvaguarda, mas como uma maneira de descobrir quais arquivos foram excluídos antes de clicar em ^ C, você pode usar o
locate
banco de dados (é claro, apenas se ele tiver sido instalado e sobreviverrm
)Eu aprendi sobre isso nesta postagem do blog
fonte
Basta usar o ZFS para armazenar os arquivos necessários para resistir à remoção acidental e ter um daemon que:
Se os arquivos forem removidos, sobrescritos, corrompidos, o que for, basta reverter seu sistema de arquivos para um clone do último bom instantâneo e pronto.
fonte
não tanto uma resposta, mas uma dica, eu sempre
rm (dir) -rf
não faço,rm -rf (dir)
ou seja: não se torne nuclear até o último momento possível.Isso ajuda a atenuar as situações nas quais você digita o nome do diretório de maneira que ainda seja uma exclusão válida, como deslizar e pressionar a tecla Enter.
fonte
rm
, onde as opções devem vir antes dos nomes dos arquivos.Eu acho que essa é uma dica de prevenção poderosa, com * atalho de expansão no shell:
Primeiro, digite
rm -rf *
ourm -rf your/path/*
, NÃO digite aEnter
chave. (é claro, você deve ter o hábito de se preocupar em não pressionar Enter rápido / acidentalmente ao usarrm -rf
)Em seguida, pressione
Alt-Shift-8
(ou sejaAlt-Shift-*
) para expandir o curinga "*" explicitamente no bash. Isso também evita inserir novamente um comando "rm -rf *" ao navegar pelo histórico.Finalmente, depois de marcada, a expansão possui os arquivos / diretórios corretos, pressione Enter.
Feito.
fonte
Caso isso ajude alguém lá fora, para o seu próprio caso:
1. Use
rmsafe
:Ele move os arquivos para uma pasta "lixeira" e você sempre tem a chance de trazê-los de volta com um simples
mv
:Fonte: https://github.com/pendashteh/rmsafe
2. Use
safe
:Você pode definir um alias para
rm
usar safe:Agora, se você executar,
rm /*
obtém isso em resposta:e acredito que você não digitará
y
!Fonte: https://github.com/pendashteh/safe
fonte