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.

użytkownik4951
źródło
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.

Stéphane Chazelas
źródło
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 ”.

Don Simon
źródło
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.

harish.venkat
źródło