Cometi um erro ontem à noite, que excluiu 1800 GB do meu servidor de arquivos sem querer

27

Eu executei este comando ontem, pensei em uma máquina de teste, mas era um servidor de arquivos conectado através do SSH.

sudo rm -rf /tmp/* !(lost+found)

Meu emulador de terminal é o Konsole. Meu sistema é o Debian 7.

Questão:

Este comando excluiu outros arquivos além dos arquivos em / tmp?

alguma coisa alguma coisa
fonte
Será que o sistema de arquivos / home não está montado?
Emmanuel
@Emmanuel Confirmei que os arquivos estão perdidos.
somethingSomething
11
Seu histórico não mostra erros de exclusão. Você matou muitos processos do sistema operacional ao executar o "kill $ (lsof / usr ...)". O deamon de compartilhamento do sistema de arquivos pode ter sido afetado. Você tentou reiniciar os serviços ou reiniciar o arquivador?
Emmanuel
11
@somethingAlgo O Konsole não é um shell, é o emulador de terminal padrão do KDE. Tente digitar alguns caracteres no terminal, como dsgsadfsfe pressione enter. Veja o resultado. Se for bash: dsgsadfsf: command not found, então seu shell é bash.
Gabor Farkas
5
Espero que você tenha bons backups. Se você tentar recuperar, pare de usar esse sistema até conseguir fazer uma cópia em nível de byte da unidade para experimentar. Quaisquer gravações no sistema de arquivos em questão exacerbarão o dano.
um CVn

Respostas:

43

A sintaxe correta no bash é a seguinte:

rm /tmp/!(lost+found)

Como o @goldilocks escreveu nos comentários, o comando original faz uma expansão na consulta (ele exclui todos os arquivos da /tmppasta, continua e exclui todos os arquivos da pasta de trabalho atual, no seu caso, a homepasta).

Você pode tentar verificar se consegue recuperar alguns dos seus dados. Há uma pergunta sobre a recuperação de dados do Linux aqui .

Gabor Farkas
fonte
28
Ah, por isso é essencialmente um outro caso do famoso "o espaço faltando em minha linha de comando que destruiu todos os meus dados" - tal como no rm -rf / tmp^^
Martin von Wittich
8
Não posso enfatizar o suficiente, que a paranóia do administrador de sistemas não é sem causa. :) Sempre faça backup dos seus dados mais valiosos em um local onde você possa escrever apenas como root.
Gabor Farkas
9
Prefiro fazer backup em um disco rígido ou servidor separado que nem seja gravável para root em circunstâncias normais. OP usado sudo, portanto, uma pasta normal apenas gravável para raiz não teria necessariamente ajudado.
Martin von Wittich
Bom ponto, não prestei atenção suficiente ao OP. Um servidor pode ser caro, no entanto, um disco separado é justo o suficiente. Eu usei uma partição separada que foi desmontada por padrão. Simples e sujo, mas eficaz.
Gabor Farkas
11
@simonzack ele pode reduzir a possibilidade de acidentes montando-se, consequentemente, é o suficiente para me :)
Gabor Farkas
26

O comando que !(lost+found)você rmcomandou foi provavelmente o erro fatal:

1978  rm -rf /tmp/* !(lost+found)
1979  sudo rm -rf /tmp/* !(lost+found)

Não sei exatamente o que bashestá fazendo com isso, mas este comando abaixo imprime tudo no meu /tmp/diretório e também todo o meu diretório atual (atualmente ~):

echo /tmp/* !(lost+found)
Martin von Wittich
fonte
O !(folder)é parte de um comando que executei uma vez, que excluiu tudo, exceto folder.
somethingSomething
3
Isso soa como algo que pode funcionar com o zsh; acho que não. Recebo !lost+found: event not foundcomo !é usado para recuperar comandos do histórico.
wurtel
9
Caramba! "Eu não sei exatamente o que o bash está fazendo com isso" -> está realizando uma expansão. Adivinha o que "tudo, exceto isso" é? cd /; echo !(lost+found)> _ <
goldilocks
13
Lembre-se de que !(foo)funciona no bash como "todos exceto foo" somente se a extglobopção estiver definida. Além disso, o OP não especificou qual shell ele está usando, então é realmente difícil adivinhar o que exatamente o rm !(lost+found)comando fez no seu caso.
jimmij
5
Ótima observação, embora o OP tenha declarado que ele está usando o Debian 7, que tem bashcomo shell padrão. Ele provavelmente não mudou isso. Além disso, no Debian 7, a extglobopção está definida como truepadrão (acabei de verificar isso).
Gabor Farkas