Co się stało, gdy „mv *”? Nie pokazano żadnych błędów, a teraz został tylko jeden folder. Dlaczego?

12

Wykonano polecenie „mv space *” w folderze z 14 GB danych.

mv *

du -hs 

jest to samo, więc gdzie poszło 14 GB danych? Co ja zrobiłem?

użytkownik3032965
źródło
Potrzebne są dodatkowe informacje. Która platforma?
Jarmund
4
@Jarmund Myślę, że można bezpiecznie założyć * nix, biorąc pod uwagę, że obie wymienione komendy są powszechnymi komendami w systemach uniksowych. W związku z tym myślę, że można bezpiecznie powiedzieć, że większość pocisków działa tak samo. Możemy więc wydedukować wystarczająco dużo, aby dać użyteczną odpowiedź, nawet jeśli dokładna platforma nie jest wyraźnie określona.
CVn
Kolejna pułapka, o której warto wspomnieć. NIGDY nie należy uruchamiać mvani cp” na niezaufanych danych. Dzieje się tak, ponieważ „ ” zostaje rozwinięte, a pliki o nazwach takich jak „--verbose” otrzymują argumenty wiersza polecenia. Co zamiast tego użyć:cp ./* anotherFolder
VasyaNovikov

Odpowiedzi:

31

Domyślam się, że bash rozszerza symbol wieloznaczny, a tym samym przenosi każdy folder do ostatniego.

Na przykład:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Tutaj mv *jest rozwinięty do mv test1 test2 test3 test4odpowiedniego mv [OPTION]... SOURCE... DIRECTORYformatu. W ten sposób każdy folder jest przenoszony do ostatniego.

ssssteffff
źródło
9
To. Nawiasem mówiąc, jeśli chcesz używać *w mv(lub cp), spójrz na ich --target-directoryprzełącznik. Zapewnia to, że nie przeszkadzają ci takie rzeczy.
CVn
2

Jak opisano w @ssssteffff, z mv *, powłoka wykonuje interpretację symboli wieloznacznych z plików w bieżącym katalogu. Jednak zachowanie mvpolecenia zależy od liczby argumentów *. Jeśli są więcej niż dwa argumenty, ostatni argument musi być katalogiem:

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

Więc,

Utworzyłem 5 plików

$ 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

Teraz, jeśli utworzę katalog, który jest ostatnim parametrem rozszerzenia symboli wieloznacznych, to:

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

Powinieneś dokładnie sprawdzić, jaki był ten ostatni argument.

  • Jeśli ostatnim argumentem był katalog, dane mogą być bezpieczne.
  • Jeśli łączna liczba argumentów wyniosła 2, a ostatnim argumentem był katalog, to również twoje dane mogą być bezpieczne.
  • Jeśli łączna liczba argumentów wynosiła 2, a ostatnim argumentem był plik, to na pewno nie ma drugiego pliku.

Czy na pewno nie widziałeś takiego błędu?

 mv: target ‘5’ is not a directory`
tuxdna
źródło