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


12

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

mv *

du -hs 

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


Требуется больше информации. Какая платформа?
— Джармунд

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формата. Таким образом, каждая папка перемещается в последнюю.


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`
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.