mv: Katalog nie jest pusty


155

Chcę przenieść zawartość katalogu do innego katalogu z tymi samymi folderami.

Oto przykład:

Mam ./backupkatalogi basei test. Teraz chcę przenieść te katalogi ./backupArchives.

Używam tego:

mv ./backup/* ./backupArchives

ale dostałem błąd

mv: cannot move './backup/base' to './backupsArchive/base': Directory not empty

Próbowałem użyć --force, ale bez powodzenia. Czy istnieje sposób na przeniesienie go, gdy foldery już istnieją?

Uwaga: Chcę tylko scalić zawartość, nie ma nadpisywania.


Czy po prostu próbujesz scalić zawartość folderów do miejsca docelowego, czy próbujesz zastąpić zawartość tego miejsca docelowego. (pomaga to również w przypadku wystąpienia CAŁEGO błędu, bez użycia ...... do obcinania danych)
Thomas Ward

Chcę tylko scalić zawartość, nie ma nadpisywania.
UdK

2
@UdK Nawet jeśli to zadziała, zwróć uwagę, że nie spowoduje to scalenia zawartości dwóch katalogów. Przeniesienie katalogu zastąpi jego cel. Spójrz rsynczamiast tego, spowoduje scalenie.
zwets

Odpowiedzi:


188

Chociaż strona man nie dokumentuje go, mvodmówi zmiany nazwy katalogu na inny katalog, jeśli katalog docelowy zawiera pliki. Jest to dobra sprawa w twoim przypadku, ponieważ okazuje się, że chcesz scalić zawartość źródła z celem, co mvsię nie uda.

Użyj rsync -a backup/ backupArchives/zamiast tego. Po tym rm -rf backup/*.

Zamiast używać rsync, możesz także zrobić klasyczne

(cd backup && tar c .) | (cd backupArchives && tar xf -)

co daje ci więcej punktów maniaków.


4
fajne rzeczy, które warto wiedzieć! Oba działają świetnie. Dzięki!
UdK

5
Punkty
maniaków

2
należy zauważyć, że wymaga to wielkości folderu w wolnej przestrzeni. I spowoduje okropne problemy, jeśli nie.
Pogrindis,

4
@Pogrindis Proszę wyjaśnić, jakie okropne problemy wystąpią i czym różnią się od innych prób zapisu na pełny dysk? Rzeczywiście, ponieważ obie operacje zachowują oryginalny katalog nienaruszony, jeśli operacja zawiedzie cię po prostu rm -rf backupArchivesbez konsekwencji, nie mówiąc już o „okropnych”.
zwets

4
Dzięki za nazwanie klasycznego podejścia, bardzo pomocne, jeśli rsync nie jest dostępny! Działa również z sudo przy użyciusudo sh -c '(cd backup && tar c .) | (cd backupArchives && tar xf -)'
ArendE

39

Szybko i brudno, jeśli wiesz, co robisz:

cp -r ./backup/* ./backupArchives && rm -R ./backup/*

3
Działa również w moim trybie awaryjnym, genialne.
Banned_User

4

Po przeniesionym katalogu potrzebujesz *(reprezentuje dowolny tekst lub liczbę). Na przykład:

mv /var/www/* /recovery/wwwrecovery/

to wszystko, jeśli przenosisz pliki, niż przenosisz jako:

mv /var/www/index.php /recovery/index.php

Innym sposobem jest spakowanie zawartości tego folderu za pomocą tar:

tar -cvzpf backup.tar.gz /var/www 

Następnie przenieś go do innego pliku. Polecam także ten krok, ponieważ smoła go kompresuje i zmniejsza.

Aby wyodrębnić pliki do innego folderu, użyj

tar -xvzpf /var/www/

Jeśli chcesz skopiować do lokalizacji, której nie jesteś właścicielem, pamiętaj, aby poprzedzić polecenie sudopoleceniem po dowolnej opcji, której chcesz użyć.

sudo tar -cvzpf backup.tar.gz /var/www/

Używam Ubuntu 12.10 i mam: mv: nieprawidłowa opcja - „R” Spróbuj „mv --help”, aby uzyskać więcej informacji. Rzeczywiście .tar jest fajny, ale muszę wiedzieć, jak przenieść moje pliki w tej sytuacji. Dziękuję za pomoc
UdK

Używam komputera stacjonarnego i serwera 12.04 i oba działają dobrze. bądź ostrożny, jeśli nie zrobiłeś miejsca między folfer i -R. też próbowałem bez -R działa dla mnie w ten sam sposób, spróbuj bez -R, ale bądź ostrożny z pisownią: linux ma znaczenie dla małych i wielkich liter !!! niż jeśli ścieżka jest niepoprawnie poruszająca się lub przemieszczająca z miejsca. jeśli nie masz tego folderu, który chcesz przenieść, po prostu wstaw -C po nim, a on go utworzy. spróbuj także najpierw: znajdź -iname nazwę swojego folderu i uruchom to polecenie z katalogu głównego, aby sprawdzić, czy istnieje ono w innym miejscu, jeśli coś pominiesz. daj mi dokładne polecenie, którego użyłeś
Dimitris Theodoridis,

whataaa ..... umieść tę nazwę pliku między betwen **
Dimitris Theodoridis

1
Z -Rpewnością nie powinno to nastąpić po pierwszym sporze. Opcje (prawie) zawsze poprzedzają argumenty polecenia. Ponadto mvnie ma -Ropcji, a na koniec rekurencja nie ma znaczenia dla mv. @DimitrisTheodoridis najpierw przetestuj swoją odpowiedź.
zwets

tak, mój bracie masz rację, zawsze mam problemy z pisownią i zawsze mam problem z terminalem lub komenda nie została znaleziona, lub też tworzę nowe pliki i katalogi, których nie znam, tylko dla podstawowej pisowni ... tak przy okazji użyłem polecenia cp, niż tutaj napisałem mv sory dla tego brata: D
Dimitris Theodoridis

4

Pewnie rsyncdziała, ale może to również działać na komputerze, który nie obsługuje rsync(tj. W cpanel, którego rsync nie jest domyślnie instalowany).

Co z użyciem:

cd /path/to/backup/ && cp -R --parents ./* ../backupArchives

Następnie usuń backupkatalog, jeśli to konieczne

Uwaga 1: Musisz przejść cddo backupkatalogu przed uruchomieniemcp -R --parents ...

Uwaga 2: Sprawdź dwukrotnie backupArchiveskatalog, jeśli masz nowe pliki z kopii zapasowej.


1

Zanim zadamy pytanie, zastanówmy się nad uproszczoną sprawą.

Załóżmy, że w / home / admin mamy dwa foldery fooi barktóre mają taką samą strukturę podkatalogów, ale każdy z nich zawiera różne pliki w nim. Teraz chcemy połączyć je w jedno. Kiedy robimy takie rzeczy mv foo/* bar, mv: directory not emptypojawia się błąd .

Moim rozwiązaniem jest zrezygnowanie z narzędzi wiersza poleceń i przejście do menedżera plików GUI, na przykład delfina. Kiedy zmienisz nazwę foona barw delfina, daje to opcję zapisu do folderu docelowego i pyta, czy zastąpić istniejące pliki, interaktywnie. Pozwala to uniknąć kopiowania i usuwania, co w efekcie oszczędza Twój czas bez jednego wiersza kodu.

PS: Nie przetestowałem każdego menedżera plików. Ale większość z nich powinna mieć tę funkcję.

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.