Mam mnóstwo plików i katalogów w podkatalogu Chcę przenieść do katalogu nadrzędnego. W katalogu docelowym jest już kilka plików i katalogów, które należy zastąpić. Pliki obecne tylko w celu powinny pozostać nietknięte. Czy mogę to zmusić mv
? To ( mv * ..
) narzeka
mv: cannot move `xyz' to `../xyz': Directory not empty
czego mi brakuje?
shell
command-line
rename
EricSchaefer
źródło
źródło
mv -f
?mv -f
nie jest poprawna odpowiedź.Odpowiedzi:
Będziesz musiał skopiować je do miejsca docelowego, a następnie usunąć źródło, używając poleceń
cp -r * ..
poprzedzonychrm -rf *
.Nie sądzę, że można „scalić” katalogi za pomocą
mv
.źródło
mv
jest szybszy, ponieważ korzystasz z tego samego systemu plików? Co jeśli użyjeszcp -l
do tworzenia twardych dowiązań, a nie przenoszenia plików?cp -a
zamiastcp -r
, aby zachować atrybuty pliku (znacznik czasu, uprawnienia itp.).cp -rl source destination && rm -r source
.rsync
prawdopodobnie byłaby lepszym rozwiązaniem tutaj. To takie proste jakrsync -a subdir/ ./
.Moje drzewo test
filename
:contents
format:Bieganie
rsync
:Daje:
A następnie, aby emulować
mv
, prawdopodobnie chcesz usunąć katalog źródłowy:Dający:
Jeśli to źle, czy możesz podać podobny przykład (np. Używając mojego drzewa testowego z góry tej odpowiedzi) z pożądanym rezultatem?
źródło
rm -r
na końcu, aby zasadniczo był taki sam jakmv
.mv
jest atomowy, zachowuje numery i-węzłów (aby plik mógł pozostać otwarty) i nie zajmuje czasu ani miejsca na wykonanie kopii.cp -r; rm -r
. Myślę, że w tym sensie teżrsync
warto wspomnieć.rsync
można usunąć źródło po kopiach z--remove-source-files
parametrem. To powinien być wygodny sposób na robienie tego, co chcesz.Z
rsync man page
:źródło
cp -r; rm
powodu braku wolnego miejsca. Zamiast tegorsync --remove-source-files
oba zminimalizowane zużyte miejsce na dysku pozwoliło uniknąć kopiowania dokładnie tych samych plików.Możesz to zrobić za pomocą
cp
irm
, ale bez kopiowania ogromnej ilości danych (prawdopodobnie) próbujesz uniknąć przeniesienia. @mattdm wspomniał o tym w swoim komentarzu , a odpowiedź na inne pytanie zawiera pełniejszą dyskusję na temat różnych opcji.Zasadniczo
-l
opcjacp
polecenia tworzy twarde łącza do plików zamiast kopiowania ich danych do nowych plików.źródło
cp -al source destination
aby zachować informacje o właścicielu i uprawnienia.cp
domyślnie zastępuje. Ta-f
opcja próbuje usunąć plik (jak wrm
) przed próbą ponownego skopiowania, co może pomóc, jeśli proces nie może otworzyć pliku do zapisu, chociaż niektórzy woleliby, aby zamiast tego wystąpił błąd. Nie wiem, czy to miało znaczenie dla PO, ale i tak dodałem-f
flagę do mojej odpowiedzi.Oto skrypt, który przenosi pliki z dołu
/path/to/source/root
do odpowiedniej ścieżki pod/path/to/destination/root
.Uwaga, nie przetestowany kod.
źródło
\;
przed-o
pierwszym wierszemfind
polecenia i nie powinieneś uciekać!
wif
- to po prostu!
, nie\!
Wątek ten istnieje od lat i wciąż zajmuje pierwsze miejsce w Google, więc chciałem dodać inną metodę. Jak zwykle to robię: pakowanie zawartości podkatalogu do tarballa, przenoszenie tarballa do katalogu nadrzędnego, a następnie wypakowanie go z domyślnym zachowaniem - overwrite. To robi dokładnie to, czego szukasz. Następnie możesz usunąć swój podkatalog.
źródło
Jeśli masz wystarczającą ilość miejsca, możesz to zrobić w następujący sposób:
Upewnij się, że nie ma żadnych ważnych plików z ~ na ich końcu, ale jeśli są, możesz dodać
--suffix=whateveryouwant
zamiast domyślnego.źródło