Як вирішити, що mv переміщується в каталог, а не замінює каталог?


18

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

Тоді я mv /hello /hello2.

Можу чи я рухатися /helloв /hello2/hello? Або я рухаюся /helloдо /hello2?

Здається, коли я роблю щось подібне, я отримую непослідовні результати.


1
У якому випадку результат є непослідовним? Здається, щоразу, коли існує цільовий каталог, він переміщується в цільовий каталог, інакше він буде перейменований.
jmathew

Це непослідовно. Ця ж команда повинна робити те саме. Це означає, що команда неоднозначна.
user4951

Це насправді непослідовно, оскільки воно діє послідовно в контексті. Хоча я бачу, як це заплутано, але чим більше я думаю про це, команда повинна бути такою, щоб працювати для всіх сценаріїв.
jmathew

Я скоріше скажу, що так воно створено, і це також логічно. Якщо ви використовуєте mvфайли, він робить те саме. Просто перейменуючи.але mvз каталогами Недобре видаляти весь каталог з підкаталогом через одну mvкоманду, яка не є безпечний. тому він переміщується як test1/test2. але якщо ви все ще хочете отримати доступ до цього, напишіть a, aliasякий перевіряє, чи вказаний параметр - каталог, а потім виконайте rm -rf каталог і використовує mvкоманду, але використовуйте її на свій страх і ризик.
harish.venkat

Я підозрюю, що ваш приклад ґрунтується на неправильному пригадуванні чогось, що відбулося в минулому, на основі "Здається, я роблю щось подібне". Якщо і те, /helloі інше - /hello2це каталоги, я помітив, cp /hello /hello2що це непослідовно. Залежно від того, яка комбінація /hello/hello2
косої косої

Відповіді:


16

mv a bнамагається перейти aв, bякщо bце каталог або символьне посилання на каталог. В іншому випадку, це буде перейменувати (або копіювати і видаляти , якщо на різних файлових системах) aдля b.

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

mv file dir/

або

mv file dir/.

Якщо dirне існує, ви отримаєте повідомлення про помилку, і він не буде перейменувати fileв dir.

Якщо, з іншого боку, ви хочете зробити renameбез занепокоєння, чи існує цільовий файл як каталог чи ні, з GNU mv ви можете зробити:

mv -T file dest

У цьому випадку fileне буде переміщено в, destякщо destце каталог. Однак якщо обидва fileі destкаталоги, і destпорожній, fileбуде перейменовано на dest(а оригінал destвидалено). Якщо обидва - це каталоги та destне порожні, mv -Tпоскаржиться.

Те ж, якщо fileі неdest є каталогами (а це включає символьні посилання, включаючи символьні посилання на каталоги), буде перейменовано в (хоча ви отримаєте підказку, якщо у вас немає дозволу на запис ), а оригінал буде видалено. Існує відмінність у випадку, коли є посилання на каталог. З , перейменований на , але без , переміщується в каталог, на який вказує .filedestdestdestmv file destdest-Tfiledest-Tfiledest

Отже, підводячи підсумок, після цього mv -T file destабо fileбуде перейменовано на, destабо ви отримаєте повідомлення про помилку (або підказку). Якщо команда вдалася, оригінал dest, якщо він існував раніше, буде видалений.


14

Це повністю залежить від того, чи вже існував каталог з назвою '/ hello2' або вже існує.

Якщо / hello2 існує AND - це каталог, то переміщення завжди переміститься / hello до / hello / hello2

Якщо / hello2 не існує, переміщення завжди перейменовує / привіт в / hello2

Якщо / hello2 існує І є файлом, ви отримаєте помилку, "не можна замінити не-каталог" hello2 "директорією" привіт ".


3

Я спробував ці

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є багатослівний режим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.