Что случилось, когда я «mv *»? Ошибки не отображались, и теперь осталась только одна папка. Почему?

12

Выполненная команда была "mv space *" в папке с 14 ГБ данных.

mv *

du -hs 

то же самое, куда ушли 14 ГБ данных? Что я сделал?

user3032965
источник
Требуется больше информации. Какая платформа?
Джармунд
4
@Jarmund Я думаю, можно предположить, что некоторые * nix, учитывая, что обе упомянутые команды являются общими командами в Unix-подобных системах. В связи с этим, я думаю, можно с уверенностью сказать, что большинство оболочек работают одинаково. Таким образом, мы можем вывести достаточно, чтобы дать полезный ответ, даже если точная платформа явно не указана.
CVn
Еще одна ловушка, чтобы упомянуть. Вы никогда не должны запускать mvили cpс " " на ненадежных данных. Это потому, что " " раскрывается, а файлы с такими именами, как "--verbose", получают аргументы командной строки. Что использовать вместо:cp ./* anotherFolder
VasyaNovikov

Ответы:

30

Я предполагаю, что bash расширяет подстановочный знак и таким образом перемещает каждую папку в вашу последнюю.

Например:

$ ls
test1  test2  test3  test4

$ mv *

$ ls
test4

$ ls test4
test1  test2  test3

Здесь mv *расширяется до mv test1 test2 test3 test4соответствующего mv [OPTION]... SOURCE... DIRECTORYформата. Таким образом, каждая папка перемещается в последнюю.

ssssteffff
источник
9
Эта. Кстати, если вы хотите использовать *в mv(или cp), то посмотрите на их --target-directoryпереключатель. Это гарантирует, что вы не получите ничего подобного.
CVn
2

Как описано @ssssteffff, с mv *помощью оболочки выполняется расширение по шаблону из файлов в текущем каталоге. Однако поведение mvкоманды зависит от того, на сколько аргументов *распространяется. Если аргументов более двух, то последним аргументом должен быть каталог:

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

Так,

Я создал 5 файлов

$ 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

Теперь, если я создам каталог, который будет последним параметром расширения подстановочных знаков, то:

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

Вы должны дважды проверить, что это был за последний аргумент.

  • Если последний аргумент был каталогом, то ваши данные, возможно, в безопасности.
  • Если общее количество аргументов было 2, а последний аргумент был каталогом, то ваши данные также могут быть в безопасности.
  • Если общее количество аргументов равнялось 2, а последний аргумент был файлом, то второй файл пропал наверняка.

Вы уверены, что не видели ошибку что-то вроде этого?

 mv: target ‘5’ is not a directory`
tuxdna
источник