Что случилось с файлом, когда я ввел «mv file.txt ../»?

Я хотел переместить «file.txt» одну папку вверх, но вместо mv file.txt ../file.txt я ввел mv file.txt ../ .

Теперь файл пропал, и я не получил сообщение об ошибке. Поэтому, похоже, некоторые действия были успешно выполнены. Но что здесь произошло?

У меня есть резервные копии, так что, по крайней мере, это не проблема. Но я хотел бы понять, что я сделал, и если я что-то изменил или если этот файл волшебным образом исчез.

Файл был перемещен в фактический родительский каталог того, в котором вы были, а не в родительский каталог символической ссылки, с которой вы следовали, чтобы попасть туда. По умолчанию cd ведет себя иначе, чем ls или mv при встрече. cd просто поднимается по пути, эффективно обращаясь за символическими ссылками, тогда как остальные идут к фактическому родительскому каталогу, в котором они находятся, независимо от того, как вы туда попали.

Представьте себе дерево каталогов ( ~ это домашний каталог и shortcut – символическая ссылка на maindir/subdir ):

 ~ ├── maindir/ │ └── subdir/ │ └── file.txt └── shortcut -> maindir/subdir/ 

Если вы просто cd на ~/shortcut тогда ls покажет file.txt , а pwd покажет ~/shortcut . Однако , в то время как вывод pwd правильный в соответствии с символической ссылкой, которую вы следовали, чтобы получить там, вы на самом деле («физически», если хотите) в ~/maindir/subdir . ls и mv знают об этом, поэтому mv file.txt .. переместит file.txt в фактический родительский каталог: ~/maindir , а не ~ как вы ожидали.

Вы можете заставить cd вести себя как другие, используя ключ -P . Поэтому, если вы находитесь в каталоге, в котором вы первоначально запускали команду mv из ( ~/shortcut ) и запускали cd -P .. , она ~/maindir вас в фактический родительский каталог (например, ~/maindir ), и вы сможете найти file.txt там с простым ls file.txt . (Вы также можете перейти к текущему текущему каталогу с помощью cd -P . .)

mv file.txt .. и mv file.txt ../file.txt имеют точно такой же эффект. В mv есть тонкое различие:

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

Итак, если dir – это каталог:

 mv file1 file2 file3 dir # Moves the files there mv file dir # Moves one file mv file dir/newname # Moves file, new name mv file newfile # Just renames 

mv file.txt ../ – вполне законная команда: вы сказали ядру переместить имя файла в родительский каталог текущего каталога. file.txt не должен исчезать, он все равно должен появиться в родительском каталоге любой директории, выданной вами.

Возможно, обстоятельства изменят происходящее. Например, если ../file.txt уже существует, его содержимое теперь является содержимым ./file.txt , и все, что ранее содержалось ../file.txt было удалено.