odpowiednik „mv” przeciągnij i upuść z zamień?

19

W środowisku GUI przeciąganie i upuszczanie z zamienianiem zastąpi pliki i całe katalogi (w tym zawartość) tym, co jest kopiowane. Czy istnieje sposób na osiągnięcie tego samego intuicyjnego wyniku za pomocą polecenia „mv”?

użytkownik7089
źródło

Odpowiedzi:

20

Nie z mv.

Podstawową funkcją mv(pomimo nazwy) jest zmiana nazwy obiektu. Jedną z gwarancji, jakie daje UNIX, jest to, że zmiany nazw są atomowe - nigdy nie zobaczysz częściowo ukończonej zmiany nazwy. Ta gwarancja może być bardzo przydatna, jeśli chcesz zmienić plik ( /etc/passwdna przykład), na który mogą patrzeć inne programy, i chcesz, aby zobaczyli starą lub nową wersję pliku i nie ma innej możliwości . Ale „rekurencyjna zmiana nazwy”, którą opisujesz, złamałaby tę gwarancję - mogłabyś zatrzymać ją na środku i miałbyś na wpół przesunięte drzewo i prawdopodobnie bałagan - i tak naprawdę nie pasuje to do filozofii z mv. Zgaduję, dlaczego mv -rnie istnieje.

(Nieważne, że mvprzerwy, że filozofia w innych, mniejszych sposobów. Na przykład, mvw rzeczywistości robi cpnastępnie rmpodczas przenoszenia plików z jednego systemu plików na inny).

Dosyć filozofii. Jeśli chcesz rekurencyjnie przenosić („przeciągnij i upuść”) drzewo z jednego miejsca do drugiego w tym samym systemie plików , możesz uzyskać wydajność i szybkość w mvnastępujący sposób (na przykład):

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

-lFlagę cpoznacza „twardy dołączenie zamiast kopiować tworzyć” - to skutecznie tworząc nową nazwę, która wskazuje na tych samych danych plików jak starego pliku. Działa to tylko w systemach plików, które obsługują twarde łącza - więc każdy natywny system plików UNIX jest w porządku, ale nie będzie działał z FAT.

Te &&środki „tylko uruchomić następujące polecenie, jeśli polecenie poprzedzające udało”. Jeśli chcesz, możesz zamiast tego uruchomić kolejno dwa polecenia.

Jander
źródło
Niezwykle informacyjny. Dziękuję Ci bardzo!
user7089
4

Nie sądzę, że można odtworzyć opisywane zachowanie przeciągania i upuszczania mv, ponieważ niepuste podkatalogi w celu nie zostaną zastąpione.

Być może rsync? Coś takiego rsync -a -r source/ target/? Uruchom -v -nnajpierw, aby wykonać pełny bieg próbny, aby upewnić się, że robi to, co chcesz.

cjc
źródło
3

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

Przeniesie wszystko z / path / do / source / folderu, łącznie z plikami i katalogami do / destination / folderu.

I nadpisze istniejące pliki i katalogi.

Tim
źródło
2
Tylko puste katalogi
Kevin
1

Prawdopodobnie będziesz chciał zmienić poprawną odpowiedź na to:

https://github.com/iaindooley/pickdrop

Przykład:

powiedz, że mam:

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

i chcę przenieść te rzeczy do / site

więc wygląda to tak:

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

Mogę iść:

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

Jest to dosłownie wycinane i wklejane.

próbnik
źródło
Bardzo fajne i zdecydowanie warte obejrzenia. Pytanie dotyczyło jednak w szczególności „mv”, więc myślę, że pozostawię prawidłową odpowiedź jako tę, która szczegółowo wyjaśnia filozofię mv. Dziękuję za ten wkład, zdecydowanie bardzo pomocny.
user7089
Warto również zauważyć z pliku Readme: „W ogóle nie jest solidny - przechowuje twoje typy w ~ / .pick, dopóki nie wywołasz drop, w którym to czasie używa ścieżek do plików w ~ / .pick, aby utworzyć nowy plik wykonywalny ~ / .drop aby skopiować każdy wybrany plik do bieżącego katalogu roboczego. ”
user7089