'mv' эквивалент перетаскивания с заменой?

19

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

user7089
источник

Ответы:

20

Не с mv.

Основная функция mv(несмотря на название) - переименовать объект. Одна из гарантий, которые дает UNIX, состоит в том, что переименования являются атомарными - вам никогда не разрешат увидеть частично завершенное переименование. Эта гарантия может быть очень полезна, если вы хотите изменить файл ( /etc/passwdнапример), который могут просматривать другие программы, и вы хотите, чтобы они видели либо старую, либо новую версию файла, и никакой другой возможности . Но «рекурсивное переименование», как вы описали, нарушило бы эту гарантию - вы могли бы остановить его в середине, и у вас было бы наполовину перемещенное дерево и, возможно, беспорядок - и поэтому оно не вписывается в философию из mv. Это мое предположение о том, почему mv -rне существует.

(Не важно , что mvперерывы , что философия в других, более мелких способах. Например, на mvсамом деле делает cpсопровождаемым rmпри перемещении файлов из одной файловой системы в другую.)

Достаточно философии. Если вы хотите рекурсивно перемещать («перетаскивать») дерево из одного места в другое в одной и той же файловой системе , вы можете получить эффективность и скорость mvследующим образом (например):

cp -al source/* dest/ && rm -r source/*

-lФлаг cpозначает «создать жесткую ссылку вместо копирования» - это фактически создание нового файла , который указывает на те же данные файла как старого файла. Это работает только на файловых системах, которые поддерживают жесткие ссылки, поэтому любая родная файловая система UNIX подходит, но она не будет работать с FAT.

В &&означает «только выполнить следующую команду , если предыдущая команда успешно». Если хотите, вместо этого вы можете запускать две команды по одной.

Jander
источник
Чрезвычайно информационный. Большое спасибо!
user7089
4

Я не думаю, что вы можете повторить поведение перетаскивания, которое вы описываете mv, поскольку непустые подкаталоги в цели не будут заменены.

Возможно rsync? Что то типа rsync -a -r source/ target/? -v -nСначала запустите команду, чтобы выполнить подробный пробный прогон, чтобы убедиться, что он выполняет то, что вам нужно.

CJC
источник
3

mv -f /path/to/source/folder/* /destination/folder/

Переместит все в / path / в / source / папку, включая файлы и каталоги в / destination / folder.

И будет перезаписывать существующие файлы и каталоги.

Тим
источник
2
Только пустые каталоги
Кевин
1

Возможно, вы захотите изменить правильный ответ на это:

https://github.com/iaindooley/pickdrop

Пример:

скажи у меня есть:

test/
test/index.php
test/images/
test/images/a.jpg
test/images/thing.png

и я хочу переместить эти вещи в / сайт

так это выглядит так:

site/
site/public/
site/public/index.php
site/public/a.jpg
site/public/thing.png

Я могу идти:

cd images &&
pick a.jpg thing.png
cd .. &&
pick index.php &&
cd .. &&
mkdir site &&
mkdir site/public &&
cd site/public &&
drop

Это буквально вырезать и вставить.

тестер
источник
Очень круто, и определенно стоит посмотреть. Тем не менее, вопрос был конкретно о «mv», поэтому я думаю, что оставлю правильный ответ как тот, который подробно объясняет философию, стоящую за mv. Спасибо за этот вклад, хотя, безусловно, очень полезно.
user7089
Также примечательно из readme: «Это совсем не надежно - он сохраняет ваши выборы в ~ / .pick до тех пор, пока вы не вызовете drop, и в это время он не использует пути к файлам в ~ / .pick для создания нового исполняемого файла ~ / .drop скопировать каждый из выбранных вами файлов в текущий рабочий каталог. "
user7089