Dlaczego plik `mv file / dir` nie przenosi pliku do podkatalogu bieżącego katalogu roboczego?

10

Byłem w moim /etckatalogu i wpisałem polecenie

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

Myślałem, że przeniesie ten plik do katalogu, openvpnktóry jest podkatalogiem tego /etckatalogu. Wydaje się jednak, że tak się nie stało. Mogę tylko potwierdzić, że polecenie zostało wykonane.

białe światło
źródło

Odpowiedzi:

51

Pod warunkiem, że katalog o tej nazwie nie istnieje, nazwa pliku została zmieniona na openvpnznajdującą się w katalogu głównym /. Aby to przywrócić, uruchom:

sudo mv /openvpn /etc/MyFile.conf

Jeśli katalog istniał, to przeniesiesz do niego plik, a następnie przywrócenie:

sudo mv /openvpn/MyFile.conf /etc/

Aby przenieść go do istniejącego podkatalogu bieżącego katalogu, możesz uruchomić dowolny z nich - używają one ścieżek względnych :

mv MyFile.conf openvpn
mv MyFile.conf openvpn/
mv MyFile.conf ./openvpn
mv MyFile.conf ./openvpn/

.to link do bieżącego katalogu, więc ./na początku ścieżki oznacza „w tym katalogu”. Ukośnik na końcu oznacza openvpnkatalog, w którym chcesz przenieść plik. Jeśli nie zapewniają go, plik zostanie przeniesiony do niego, jeśli katalog o tej nazwie istnieje, inny plik zostanie przemianowany na openvpn. Znak „ /na końcu” mvostrzega o braku katalogu i nie zmienia nazwy, więc jest to bezpieczny sposób, jeśli nie chcesz zmieniać nazwy.

Jeśli twoja ścieżka zaczyna się /od, jest to ścieżka bezwzględna niezależnie od bieżącego katalogu roboczego, zawsze jest względna do katalogu głównego /. Używając ścieżek bezwzględnych zarówno dla pliku, jak i miejsca docelowego, twoje polecenie wyglądałoby tak:

mv /etc/MyFile.conf /etc/openvpn
mv /etc/MyFile.conf /etc/openvpn/

Dalsza lektura

deser
źródło
2
Jeśli nie wiesz, czy katalog istniał, sudo mv /openvpn/MyFile.conf /etc/najpierw wypróbuj polecenie. W prawdopodobnym scenariuszu katalog nie istniał, po prostu wyświetli błąd (prawdopodobnie „Nie katalog”) i nie dotknie systemu plików. Następnie możesz po prostu zrobić sudo mv /openvpn /etc/MyFile.conf.
flarn2006
9

Musisz użyć

me@mylaptop:/etc$ sudo mv MyFile.conf openvpn/

przenieść MyFile.confplik do openvpnpodkatalogu /etc/.

Z drugiej strony

me@mylaptop:/etc$ sudo mv MyFile.conf /openvpn

zamiast tego przeniósłby plik do /katalogu jako openvpn(tj. zmienił nazwę na as openvpn) (zakładając, że /openvpnkatalog nie istnieje).

pomsky
źródło
3
Ponadto ukośnik na końcu pierwszego polecenia jest opcjonalny. Ale myślę, że to dobry nawyk, aby się do tego przyzwyczaić, ponieważ spowoduje to, że polecenie nie powiedzie się, jeśli nie jest katalogiem, zamiast tworzyć mylącą sytuację, taką jak opisany OP (lub, co gorsza, zastępowanie ważnego pliku.)
flarn2006
4

Przenosząc plik, informujesz system operacyjny o katalogu, w którym chcesz go umieścić, lub o nowej ścieżce, którą chcesz podać.

Powiedziałeś systemowi operacyjnemu „/ openvpn”. Więc zrobi to dokładnie - sprawdź, czy / openvpn istnieje (co oznacza obiekt o nazwie „openvpn” znajdujący się w katalogu głównym) i jest katalogiem, a jeśli tak, przenieś do niego swój plik, lub jeśli / openvpn jest plikiem lub nie istnieje, zmień nazwę i przenieś plik, aby był dostępny jako / openvpn.

To, co chciałeś zrobić, to przenieść go do katalogu „openvpn”, który znajduje się w twoim bieżącym katalogu , a nie w katalogu głównym systemu plików (co oznacza wiodące „/”). Musiałeś więc wskazać ten katalog w poleceniu move, a nie ścieżkę bezwzględną „/ openvpn”. Każdy z nich będzie działał:

  • mv MyFile.conf openvpn - spójrz do mojego obecnego katalogu na ten „openvpn”
  • mv MyFile.conf /etc/openvpn - poszukaj absolutnej ścieżki / etc / openvpn
  • mv MyFile.conf openvpn/ - zajrzyj do mojego aktualnego katalogu, aby znaleźć katalog o nazwie openvpn
  • mv MyFile.conf ./openvpn - czyni „obecny katalog” jeszcze bardziej oczywistym

Krótka wersja - prawdopodobnie użyłeś słowa „/”, aby oznaczać „mój bieżący katalog”, dlatego też „/ openvpn” oznacza „openvpn, który znajduje się w moim bieżącym katalogu”. Ale wiodące „/” zawsze oznacza „katalog główny”, więc „/ openvpn” oznacza „openvpn w katalogu głównym”. Potrzebne było po prostu użycie „openvpn” lub „openvpn /”, co oznacza „openvpn w moim bieżącym katalogu ”.

Stilez
źródło
1
Nie jestem pewien, dlaczego ta odpowiedź została odrzucona; jest poprawne i myślę, że to jest najwyraźniejsze!
Wyścigi lekkości na orbicie
1

Każda ścieżka, która zaczyna się od, /jest ścieżką bezwzględną, a nie względną.

Gdyby wszystkie ścieżki były zawsze względne w stosunku do bieżącego katalogu, jak byś to zrobił cd /etc? Musiałbyś mieć cd ../../../../../etcnadzieję, że to wystarczający poziom .., lub po prostu kontynuuj, cd ..aż dojdziesz do katalogu głównego.

Lub potrzebujesz innej składni, aby wyrazić ścieżki bezwzględne. Ale Unix zdecydował się na /znaczenie absolutne, wszystko inne jest związane z bieżącym katalogiem roboczym procesu. Tak mv MyFile.txt openvpnby działało.


I nie, nie byłoby dobrze, aby wnioskować o wartości bezwzględnej i względnej na podstawie plików istniejących lub nie. Nie chcemy mkdirwywołań systemowych traktować odmiennie od ścieżek chdirlub renamewywołań systemowych oraz dokonywania mvprogramu zrobić to po prostu pozostawia pole do rozbieżności pomiędzy mvi innego programu, która pobiera nazwę pliku wyjściowego.

mvjest już wyjątkowy, ponieważ gdy rename()miejscem docelowym jest katalog, dołącza źródłową nazwę pliku do tego katalogu docelowego i próbuje ponownie. Zauważ jednak, że jedna prosta strategia implementacji opiera się na pierwszym rename()niepowodzeniu wywołania systemowego z EEXISTlub EISDIR. Musimy więc wiedzieć, czy ścieżka jest względna czy bezwzględna przed sprawdzeniem systemu plików.

(Wczesny Unix działał na wolnych komputerach, gdzie dodatkowe sprawdzenie, czy katalog istnieje, może oznaczać dodatkowe operacje wejścia / wyjścia, jeśli nie były buforowane, lub większą presję na buforowanie katalogu. Ale myślę, że argumenty rozsądku / poprawności są wystarczające, aby wyjaśnić, dlaczego pierwszy zgadujesz nie był to wiarygodny sposób działania systemu bez uciekania się do historycznych argumentów dotyczących wydajności).

Peter Cordes
źródło
1

Aby wypełnić pozostałe odpowiedzi:

mv file.txt /location

jest taki sam jak dla Windows

mv file.txt c:\location

System plików w systemie Linux jest uważany za zgodny ze standardem hierarchii systemu plików , w skrócie FHS . pomaga wiedzieć, gdzie należy umieścić plik, w zależności od jego charakteru i zawartości.

Pierwszy folder (odpowiednik c:w systemie Windows) to /.

Pierre-Antoine Guillaume
źródło