Mam dwa katalogi obrazów i obrazy2 o tej strukturze w systemie Linux:
/images/ad
/images/fe
/images/foo
... i inne 4000 folderów
a drugi jest jak:
/images2/ad
/images2/fe
/images2/foo
... i inne 4000 folderów
Każdy z tych folderów zawiera obrazy, a nazwy katalogów pod obrazami i obrazami2 są dokładnie takie same, jednak ich zawartość jest inna. Następnie chcę wiedzieć, jak mogę skopiować-scalić obrazy / images2 / ad do obrazów / reklamy, obrazy / images2 / foo do obrazów / foo i tak dalej ze wszystkimi 4000 folderami ..
Odpowiedzi:
To jest zadanie dla rsync . Nie ma korzyści z robienia tego ręcznie za pomocą pętli powłoki, chyba że chcesz przenieść plik zamiast go skopiować.
W Twoim przypadku:
(Zwróć uwagę, że slash będzie włączony
images2
, w przeciwnym razie zostanie skopiowany/images/images2
).Jeśli obrazy o tej samej nazwie istnieją w obu katalogach, powyższe polecenie zastąpi
/images/SOMEPATH/SOMEFILE
je/images2/SOMEPATH/SOMEFILE
. Jeśli chcesz zastąpić tylko starsze pliki, dodaj opcję-u
. Jeśli chcesz zawsze zachować wersję/images
, dodaj opcję--ignore-existing
.Jeśli chcesz przenieść pliki
/images2
z rsync, możesz przekazać tę opcję--remove-source-files
. Następnie rsync kopiuje kolejno wszystkie pliki i po zakończeniu usuwa każdy plik. Jest to o wiele wolniejsze niż przenoszenie, jeśli katalog źródłowy i docelowy znajdują się w tym samym systemie plików.źródło
rsync
, a następnierm -r /images
.rsync -a images images2
, po prostu skopiuje obrazy2 do obrazów zamiast ich scalania.Najlepszym wyborem, jak już napisano, jest oczywiście rsync. Niemniej jednak również unison byłby świetnym oprogramowaniem do wykonywania tej pracy. Oba mogą być używane w kilku systemach operacyjnych.
Rsync
rsync synchronizuje w jednym kierunku od źródła do miejsca docelowego. Dlatego następujące oświadczenie
synchronizuje wszystko od źródła do miejsca docelowego . Scalony folder znajduje się w lokalizacji docelowej .
-a oznacza „archiwizuj” i kopiuje wszystko rekurencyjnie od źródła do miejsca docelowego, zachowując prawie wszystko.
-v daje więcej danych wyjściowych („pełne”).
-h dla czytelnego dla człowieka.
- postęp, aby pokazać, ile pracy zostało wykonane.
Jeśli chcesz tylko zaktualizować do docelowego folderu z nowszych plików z folderu źródłowego:
Unisono
unison synchronizuje w obu kierunkach. Dlatego następujące oświadczenie
synchronizuje oba katalogi w obu kierunkach i ostatecznie źródło równa się celowi To tak, jakby dwukrotnie wykonać rsync ze źródła do dest i odwrotnie.
Bardziej zaawansowane zastosowania można znaleźć na stronach podręcznika użytkownika lub w następujących witrynach:
źródło
rsync -avh --progress source/ destination/
, w przeciwnym razie folder źródłowy zostanie utworzony w folderze docelowym, przynajmniej w moim przypadku tak było.Zapętlaj całą zawartość
images2
korzystania z rozszerzonego globu (aby uniknąć problemów z parsowaniemls
), a następniemv
zawartość tych elementów do pasującego wpisu wimages
. Używabasename
do usuwania wiodącejimages2
ścieżki z globbed ścieżki.źródło
@ inulinux12, możesz użyć następującej
for
pętli jednej linii z wiersza poleceń:Spowoduje to przeniesienie wszystkich plików z
images2
doimages
odpowiednich katalogów. Uwaga: zakłada się, że żadne pliki nie mają takiej samej nazwy.Na przykład:
Przed wykonaniem:
Po wykonaniu:
źródło
ls
. mywiki.wooledge.org/ParsingLsbasename
w tej konkretnej sytuacji (nie trzeba do tego dzwonićbasename
). Jeszcze raz dziękuję za konstruktywne komentarze.