Jak zdecydować, że mv przenosi się do katalogu zamiast go zastępować?


18

Powiedz, że mam katalog /hello.

Więc robię mv /hello /hello2.

Ja porusza /hellosię /hello2/hello? Czy przeprowadzam /hellosię /hello2?

Wydaje się, że kiedy robię coś takiego, osiągam niespójne wyniki.


1
W jakim przypadku wynik jest niespójny? Wydaje się, że kiedykolwiek istnieje katalog docelowy, przenosi się do katalogu docelowego, w przeciwnym razie zostaje zmieniona jego nazwa.
— brat

To jest niespójne. To samo polecenie powinno zrobić to samo. Oznacza to, że polecenie jest niejednoznaczne.
— user4951

Nie jest to niespójne, ponieważ działa konsekwentnie w kontekście. Chociaż widzę, że jest to mylące, ale im więcej o tym myślę, polecenie musi być takie, aby działało we wszystkich scenariuszach.
— jmathew 15.01.2013

Wolałbym powiedzieć, że jest tak zaprojektowany i logiczny .. jeśli używasz mvz plikami, robi to samo. Wystarczy zmienić nazwę. Ale mvz katalogami Nie warto usuwać całego katalogu z podkatalogiem z powodu jednego mvpolecenia, które nie jest bezpieczny. więc jest przenoszony jako test1/test2. ale jeśli nadal chcesz go osiągnąć, napisz, aliasktóry sprawdza, czy podanym parametrem jest katalog, a następnie wykonaj mvkomendę rm -rf katalog i użyj polecenia, ale użyj go na własne ryzyko.
— harish.venkat 15.01.2013

Podejrzewam, że twój przykład opiera się na błędnym zapamiętaniu czegoś, co wydarzyło się w przeszłości, na podstawie „Wygląda na to, że robię coś takiego”. Jeśli oba /helloi /hello2są katalogi, a ja zauważyłem, że cp /hello /hello2jest jeden to niespójne. W zależności od kombinacji końcowych ukośników, czasami zawartość /hellojest kopiowana /hello2, a czasem sam katalog jest kopiowany.
— Izkata

Odpowiedzi:


16

mv a bpróbuje przejść ado bif bjest katalogiem lub dowiązaniem symbolicznym do katalogu. W przeciwnym razie zmieni nazwę (lub skopiuje i usunie, jeśli w różnych systemach plików) ana b.

Aby uzyskać spójny wynik przeniesienia pliku do katalogu, możesz:

mv file dir/

lub

mv file dir/.

Jeśli dirnie istnieje, pojawi się błąd i nazwa nie zostanie zmieniona filena dir.

Jeśli z drugiej strony chcesz to zrobić, renamenie martwiąc się, czy plik docelowy istnieje jako katalog, czy nie, w GNU mv możesz:

mv -T file dest

W takim przypadku filenie zostanie przeniesiony do katalogu destif dest. Jednakże, jeśli obie filei destsą katalogi i destjest pusta, filezostanie zmieniona na dest(i oryginalna destusuwane). Jeśli oba są katalogami i destnie są puste, mv -Tbędą narzekać.

To samo, jeśli filei niedest są katalogami (i które obejmują dowiązania symboliczne, w tym dowiązania symboliczne do katalogów), zostaną przemianowane na (chociaż pojawi się monit, jeśli nie masz uprawnień do zapisu ), a oryginał zostanie usunięty. Jest różnica w przypadku, gdy jest dowiązanie symboliczne do katalogu. Dzięki , zostanie zmieniona na , ale bez , jest przenoszony do katalogu wskazywanego przez .filedestdestdestmv file destdest-Tfiledest-Tfiledest

Podsumowując, po mv -T file destalbo filezostanie zmieniona nazwa , albo pojawi destsię komunikat o błędzie (lub monit). Jeśli polecenie się powiedzie, oryginał dest, jeśli wcześniej istniał, zostanie usunięty.


14

Jest to całkowicie zależne od tego, czy istnieje już katalog o nazwie „/ hello2”, czy nie.

Jeśli istnieje / hello2 AND to katalog, wówczas move zawsze przenosi / hello do / hello / hello2

Jeśli / hello2 nie istnieje, ruch zawsze zmieni nazwę / hello na / hello2

Jeśli / hello2 istnieje AND to plik, pojawi się błąd „nie można zastąpić katalogu innego niż„ hello2 ”katalogiem„ hello ”.


3

Próbowałem tych

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'

mam nadzieję, że to wszystko wyjaśnia. -vjest trybem pełnym.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.