'mv' еквівалент перетягування з заміною?


19

У середовищі графічного інтерфейсу перетягування із заміною замінить файли та цілі каталоги (включаючи вміст) з тим, що копіюється. Чи є спосіб досягти цього самого інтуїтивного результату командою 'mv'?

Відповіді:


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.

В &&означає «тільки виконати наступну команду , якщо попередня команда успішно». Якщо вам подобається, ви можете замість цього виконувати дві команди по одній.


Надзвичайно інформативні. Велике спасибі!
user7089

4

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

Можливо rsync? Щось схоже rsync -a -r source/ target/? -v -nСпершу запустіть з вербовим сухим циклом, щоб переконатися, що він робить те, що ви хочете.


3

mv -f /path/to/source/folder/* /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, поки ви не зателефонуєте, в який час він не використовує шляхи до файлу в ~ / .pick для створення нового виконуваного файлу ~ / .drop скопіювати кожен із вибраних файлів у поточний робочий каталог. "
користувач7089,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.