O que aconteceu quando eu "mv *"? Nenhum erro foi mostrado e agora resta apenas uma pasta. Por quê?

12

O comando executado foi "mv space *" em uma pasta com 14 GB de dados.

mv *

du -hs 

é o mesmo; para onde foram os 14 GB de dados? O que eu fiz?

user3032965
fonte
Mais informações são necessárias. Qual plataforma?
Jarmund 18/04
4
@ Jarmund Eu acho que é seguro assumir alguns * nix, considerando que os dois comandos mencionados são comandos comuns em sistemas similares ao Unix. A esse respeito, acho seguro dizer que a maioria das conchas funciona da mesma maneira. Portanto, podemos deduzir o suficiente para fornecer uma resposta útil, mesmo que a plataforma exata não esteja explicitamente declarada.
um CVn
Outra armadilha a ser mencionada. Você NUNCA deve executar mvou cp" " com dados não confiáveis. Isso ocorre porque " " é expandido e arquivos com nomes como "--verbose" obtêm argumentos da linha de comando. O que usar em vez disso:cp ./* anotherFolder
VasyaNovikov 27/02

Respostas:

30

Meu palpite é que o bash expande o curinga e, assim, move todas as pastas para a última.

Por exemplo:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Aqui, mv *é expandido para mv test1 test2 test3 test4corresponder ao mv [OPTION]... SOURCE... DIRECTORYformato. Assim, cada pasta é movida para a última.

ssssteffff
fonte
9
Este. A propósito, se você deseja usar *um mv(ou cp), dê uma olhada no --target-directoryswitch deles . Isso garante que você não se deixe levar por coisas assim.
um CVn
2

Conforme descrito por @ssssteffff, with mv *, o shell está fazendo expansão de curinga a partir dos arquivos no diretório atual. No entanto, o comportamento do mvcomando depende de quantos argumentos se *expande. Se houver mais de dois argumentos, o último argumento deverá ser um diretório:

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

Então,

Eu criei 5 arquivos

$ touch 1 2 3 4 5
$ ls
1  2  3  4  5
$ mv *
mv: target ‘5’ is not a directory
$ ls
1  2  3  4  5

Agora, se eu criar um diretório que vem como último parâmetro para a expansão de curingas, então:

$ mkdir 6
$ mv *
$ ls
6
$ ls 6
1  2  3  4  5

Você deve verificar qual foi o último argumento.

  • Se o último argumento foi um diretório, talvez seus dados estejam seguros.
  • Se o número total de argumentos for 2 e o último argumento for um diretório, talvez seus dados também estejam seguros.
  • Se o número total de argumentos for 2 e o último argumento for um arquivo, o segundo arquivo desaparecerá com certeza.

Tem certeza de que não viu o erro em algo assim?

 mv: target ‘5’ is not a directory`
tuxdna
fonte