O que exatamente fez o mv / tmp / folder / * / * no meu sistema de arquivos?

4

É difícil procurar por caracteres especiais no google, e é por isso que estou postando isso aqui.

Eu recentemente corri (como root) um mv /tmp/folder/* /* quando eu pretendia executar mv /tmp/folder/* ./ Grande erro!

As coisas quebraram! Um monte de arquivos foi misturado e colocado em lugares estranhos, nenhum dos comandos normais do unix funcionou (ls, dir, cat, etc) e uma vez que você efetuou logoff, você não poderia voltar para o ssh - isso lhe daria um prompt , mas não aceita as senhas antigas.

A execução de ls /* mostra que ele realiza ls em todos os diretórios em / . Se eu tentasse desenhar um paralelo, então mv deveria simplesmente ter movido (ou copiado?) Os arquivos para todos os diretórios em / . Em vez disso, coisas realmente estranhas aconteceram, e eu estava apenas curioso sobre o que exatamente estava acontecendo.

Mais informações: Os arquivos na pasta / tmp / foram transferidos de uma máquina windows e tinham o nome de file (#) .txt, onde (#) é um número de até dois dígitos, com um espaço entre o arquivo e os parênteses. Havia ~ 40 desses arquivos de texto.

    
por M L 18.06.2013 / 20:53

3 respostas

9

O comando mv recebe uma lista de argumentos que podem ser arquivos ou diretórios. Se o último argumento for um diretório, todos os outros serão movidos para aquele.

No seu caso, mv /tmp/folder/* /* expande para mv <the list of files in /tmp/folder> <the list of files in /> . Então, como você pode imaginar, todos os arquivos em /tmp/folders/ e todos os arquivos em / , mas o último, foram movidos para a última pasta listada por /* (que provavelmente é /var ).

    
por 18.06.2013 / 21:01
5

Você está imaginando os argumentos do mv errados. Na página do manual:

SYNOPSIS  
      mv [OPTION]... SOURCE... DIRECTORY

mv recebe muitos argumentos SOURCE , mas apenas um destino DIRECTORY . mv não pode mover um arquivo para vários destinos ou precisaria copiá-lo. Como (como você disse) /* resolvido para todos os diretórios em / , todos (exceto o último) teriam sido adicionados à lista SOURCE , então você moveu todos os diretórios para o diretório listado por último no a linha de comando.

Se você inicializar um LiveCD e montar a unidade, provavelmente poderá desfazer o dano; haverá apenas um diretório à esquerda na raiz (provavelmente /var ), e você pode mover todos os diretórios que devem estar na raiz para fora dele

    
por 18.06.2013 / 21:03
0

Para verificar o que exatamente o comando mv fez, você pode verificá-lo adicionando echo antes do comando, portanto, o shell expandirá todos os curingas e imprimirá o comando resultado, por exemplo:

$ echo mv /tmp/folder/* /*

$ echo mv /tmp/* /*
mv /tmp/launch-4TgsLB /tmp/skl /bin /dev /etc /home /lost+found /mnt /net /opt /private /sbin /tmp /usr /var

Então, basicamente, ele moverá seus arquivos para a última pasta em seu sistema raiz, provavelmente /var .

Leia mais: O que o mv * faz?

    
por 22.08.2014 / 10:19

Tags