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?


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.


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`
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.