Как решить, что mv перемещается в каталог, а не заменяет каталог?

Скажем, у меня есть каталог /hello .

Тогда я делаю mv /hello /hello2 .

Я перемещаюсь /hello в /hello2/hello ? Или я перемещаюсь /hello в /hello2 ?

Кажется, что, когда я делаю что-то подобное, я получаю несогласованные результаты.

  • Как изменить права доступа к файлам, если в имени файла есть пробел в linux
  • переименовывать файлы, соответствующие определенному значению mtime в каталоге
  • Как исправить каталог, неправильно скопированный в себя?
  • mv: can not stat Нет такого файла или каталога в сценарии оболочки
  • обратные ссылки в regex `rename`
  • Переименуйте файл со странным именем на Samba mount
  • Массовое переименование, префикс изменения
  • Переименование пучка файлов, но сохранение номера части
  • 3 Solutions collect form web for “Как решить, что mv перемещается в каталог, а не заменяет каталог?”

    mv ab пытается переместить a в b если b является каталогом или символической ссылкой на каталог. В противном случае он переименует (или скопирует и удалит, если в разных файловых системах) a b .

    Чтобы получить согласованный результат для перемещения файла в каталог, вы можете:

     mv file dir/ 

    или

     mv file dir/. 

    Если dir не существует, вы получите сообщение об ошибке, и он не переименует file в file .

    Если, с другой стороны, вы хотите rename не беспокоясь о том, существует ли целевой файл в качестве каталога или нет, с помощью GNU mv вы можете:

     mv -T file dest 

    В этом случае file не будет перемещен в dest если dest является каталогом. Однако, если оба file и dest являются каталогами, а dest пуст, file будет переименован в dest (и исходный dest удален). Если оба каталога и dest не являются пустыми, mv -T будет жаловаться.

    То же самое, если file и dest не являются каталогами (и которые включают символические ссылки, включая символические ссылки в каталоги), file будет переименован в dest (хотя вы получите приглашение, если у вас нет разрешения на запись для dest ), а исходный dest будет удалить. Есть разница с mv file dest в случае, когда dest является символической ссылкой на каталог. С -T file переименовывается в dest , но без -T , file перемещается в каталог, на который указывает dest .

    Итак, чтобы подвести итог, после mv -T file dest , либо file будет переименован в dest либо вы получите сообщение об ошибке (или подсказку). Если команда выполнена успешно, исходный dest , если он существовал заранее, будет удален.

    Это полностью зависит от того, существует ли уже существующая директория с именем '/ hello2' или нет.

    Если / hello2 существует AND является каталогом, тогда перемещение всегда будет перемещаться / hello в / hello / hello2

    Если / hello2 не существует, то move всегда будет переименовывать / hello в / hello2

    Если / hello2 существует AND является файлом, вы получите сообщение об ошибке: «Нельзя перезаписывать не-каталог« hello2 »с помощью каталога« hello ».

    Я пробовал эти

     mkdir test1 mv -v test1 test2 output:`test1' -> `test2' mkdir test1 mv -v test2 test1 output: `test2' -> `test1/test2' touch test2 output:mv: cannot overwrite non-directory `test2' with directory `test1' 

    надеюсь, это все объясняет. -v – это подробный режим.

    Linux и Unix - лучшая ОС в мире.