Jeśli użyję mv
do przeniesienia folderu o nazwie „folder” do katalogu, który już zawiera „folder”, czy zostaną scalone, czy zastąpione?
149
mv
nie można scalić ani zastąpić katalogów, zakończy się niepowodzeniem z komunikatem „mv: nie można przenieść„ a ”do„ b ”: katalog nie jest pusty” , nawet jeśli korzystasz z tej --force
opcji.
Możesz obejść ten problem za pomocą innych narzędzi (takich jak rsync
, find
a nawet cp
), ale musisz dokładnie rozważyć konsekwencje:
rsync
może łączyć zawartość jednego katalogu w inny (najlepiej z opcją --remove-source-files
1 , aby bezpiecznie usunąć tylko te pliki źródłowe, które zostały pomyślnie przesłane, oraz ze zwykłą opcją zezwolenia / posiadania / zachowania czasu, -a
jeśli chcesz) rsync
„s --link-dest=DIR
opcję (aby utworzyć hardlinki zamiast kopiowania zawartości plików, o ile to możliwe) i --remove-source-files
dostać semantyczny bardzo podobny do regularnych mv
. --link-dest
celu należy podać bezwzględną ścieżkę do katalogu źródłowego (lub ścieżkę względną od miejsca docelowego do źródła ). --link-dest
w niezamierzony sposób (co może, ale nie musi powodować powikłań), wymaga znajomości (lub ustalenia) bezwzględnej ścieżki do źródła (jako argumentu --link-dest
) i ponownie pozostawia pustą strukturę katalogów do wyczyszczenia jako na 1 .find
do sekwencyjnego odtworzenia struktury katalogu źródłowego w miejscu docelowym, a następnie pojedynczego przeniesienia rzeczywistych plików cp
może tworzyć twarde linki (po prostu dodatkowe wskaźniki do tego samego istniejącego pliku), co daje wynik bardzo podobny do scalania mv
(i jest bardzo wydajny we / wy, ponieważ tworzone są tylko wskaźniki i nie trzeba kopiować żadnych danych) To, które z tych obejść (jeśli w ogóle) jest odpowiednie, będzie bardzo zależeć od konkretnego przypadku użycia.
Jak zawsze, zastanów się, zanim wykonasz dowolne z tych poleceń, i wykonaj kopie zapasowe.
1: Pamiętaj, że rsync --remove-source-files
nie usunie żadnych katalogów, więc będziesz musiał zrobić coś takiego, find -depth -type d -empty -delete
aby pozbyć się pustego drzewa katalogów źródłowych.
mv
. Ta odpowiedź byłaby lepsza z szerszą prawdą. Linux, BSD i „prawdziwy” Unix lub referencje z POSIX lub SUS.mv
implementację używaną przez Debiana - nacisk został położony na wypróbowanie , ponieważ strona nie wspomina o tym zachowaniu ...--delete
usuwa tylko pliki z katalogu docelowego , które nie istnieją w katalogu źródłowym.-H
funkcji lub możesz dowiązać pliki w miejscu docelowym za pomocą--link-dest
. Jednak przed skorzystaniem z nich zajrzyj na stronę manuala.źródło
--remove-source-files
ma tę zaletę, że usuwa tylko pliki, które zostały pomyślnie przesłane, dzięki czemu można użyćfind
do usunięcia pustych katalogów i pozostanie ze wszystkim, co nie zostało przesłane, bez konieczności sprawdzaniarsync
danych wyjściowych.Możesz użyć
-l
opcji polecenia cp , która tworzy twarde łącza plików w tym samym systemie plików zamiast kopii pełnych danych. Następujące polecenie kopiuje foldersource/folder
do folderu nadrzędnego (destination
), który już zawiera katalog o nazwiefolder
.Możesz także użyć
-P
(--no-dereference
- nie usuwaj odsyłaczy symbolicznych) lub-a
(--archive
- zachowaj wszystkie metadane, w tym także-P
opcję), w zależności od potrzeb.źródło
cp
raczej niżrsync
odkąd każdy system macp
i każdy zna go.cp
z czasem operacjimv
.-n
mv /fs1/file /fs2/
(w różnych systemach plików) wykona kopię, a następnie usunie.mv
będzie działać (pod warunkiem, że docelowy katalog jeszcze nie istnieje), nawet jeśli nie będzie „wydajnie” lub jakkolwiek go nazwiesz,cp -rl
zawiedzie.Poleciłbym te cztery kroki:
lub jeszcze lepiej, oto skrypt, który implementuje semantykę podobną do
mv
:źródło
rsync -u
(aktualizuj tylko, jeśli nowszy),mv
(przynajmniej w niektórych wersjach), możesz również skorzystać z tej-u
opcji. Jednak w takim przypadku możesz usunąć niepuste katalogi źródłowe, a także puste, aby uwzględnić przypadki, w których pliki w drzewie źródłowym nie są nowsze. @schuess: Wygląda na to, że może być wiele argumentów SOURCE, jeśli jest to potrzebne.Oto sposób, który połączy katalogi. Jest znacznie szybszy niż rsync, ponieważ po prostu zmienia nazwy plików zamiast je kopiować, a następnie usuwać.
źródło
dest
jest już katalogiem o takiej samej nazwie jak insource
. I pliki zostaną przeniesione dodest
, który jest wsource
. Komenda nie robi nic więcejmv source/* source/dest/.
Jednym ze sposobów osiągnięcia tego jest użycie:
Dopóki nie ma dwóch plików o tej samej nazwie
folder
idirectory/folder
, osiągniesz ten sam wynik, tj. Scalenie.źródło
rm folder
działa?rm folder -fR
zawsze działa dla mnieDo najczystszych kopii używam metody kopiowania bloków tar (-) B.
przykład z wewnątrz ścieżki źródłowej (w razie potrzeby „cd”):
tworzy to dokładną kopię drzewa źródłowego, Z nienaruszonym właścicielem i uprawnieniami. A jeśli folder docelowy istnieje, dane zostaną scalone. Tylko pliki, które już istnieją, zostaną zastąpione.
Przykład:
Gdy operacja kopiowania zakończy się powodzeniem, możesz usunąć source (
rm -rf <source>
). Oczywiście nie jest to dokładny ruch: dane będą kopiowane, dopóki nie usuniesz źródła.Opcjonalnie możesz być gadatliwy (wyświetl na ekranie kopiowany plik), przy pomocy -v:
tar cBvf -
c
: StwórzB
: czytaj pełny blok (do odczytu potoku)v
: pełnyf
: plik do zapisux
: wyciąg-
: stdout / stdinsourcefolder
może być również*
(dla czegokolwiek w bieżącym folderze)źródło
f -
tar jest zwykle niepotrzebne - domyślnie jest to odczyt ze stdin / write na stdout.Oto skrypt, który zadziałał dla mnie. Wolę mv niż rsync, więc używam rozwiązań Jewel i Jonathan Mayer.
źródło
Używanie poleceń takich jak cp lub rsync nie jest dobrym pomysłem. W przypadku dużych plików zajmie to dużo czasu. mv jest znacznie szybszy, ponieważ aktualizuje tylko i-węzły bez fizycznego kopiowania plików. Lepszą opcją jest użycie menedżera plików w systemie operacyjnym. W opensuse istnieje menedżer plików o nazwie Konquerer. Może przenosić pliki bez ich kopiowania. Ma funkcję „wycinaj i wklej” jak w systemie Windows. Wystarczy wybrać wszystkie podkatalogi w katalogu A. Kliknij prawym przyciskiem myszy i przejdź do katalogu B, który może zawierać podkatalogi o tych samych nazwach. Połączy je. Istnieją również opcje, czy chcesz zastąpić lub zmienić nazwę plików o tej samej nazwie.
źródło
mv
zostanie użyty.Rozwiązanie Python
Ponieważ nie mogłem znaleźć zadowalającego wcześniej istniejącego rozwiązania, postanowiłem zrobić szybki skrypt Pythona, aby to osiągnąć.
W szczególności ta metoda jest wydajna, ponieważ podchodzi do drzewa plików źródłowych tylko raz oddolnie.
Umożliwi to także szybkie dostosowanie ustawień, takich jak obsługa nadpisywania plików do własnych upodobań.
Stosowanie:
przeniesie całą zawartość
src/*
dodest/
isrc/
zniknie.move-merge-dirs
GitHub w górę .
Zobacz także: https://stackoverflow.com/questions/22588225/how-do-you-merge-two-directories-or-move-with-replace-from-the-windows-command
źródło
To polecenie służy do przenoszenia plików i folderów do innego miejsca docelowego:
Pamiętaj :
mv
polecenie nie będzie działać, jeśli folder jest b̲e̲i̲n̲g m̲e̲r̲ge̲d̲ (tzn. Inny folder o tej samej nazwie już istnieje w miejscu docelowym), a d̲e̲s̲t̲i̲n̲a̲t̲i̲o̲n̲ o̲n̲e̲ i̲s̲ n̲o̲t̲ e̲m̲pt̲y .Jeśli folder docelowy jest pusty, powyższe polecenie będzie działać poprawnie.
Tak więc, aby scalić oba foldery w każdym przypadku,
Zrób to za pomocą 2 poleceń:
Lub połącz oba jako jednorazowe polecenie:
źródło