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.

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

zwets
źródło
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/*
patrickvacek
źródło
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/
Dimitris Theodoridis
źródło
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.

Atillo Regner Rex
źródło
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ę.

navigaid
źródło