Poszukuję polecenia bash, aby rekurencyjnie znajdować i kopiować tylko pliki z jednej hierarchii katalogów do drugiej

0

Czy można uruchomić komendę bash, która zastąpi wszystkie pliki w jednej strukturze katalogów wszystkimi plikami w innym. Na przykład, jeśli mam te dwie struktury katalogów:

dest
dest/A
dest/A/B
dest/A/B/file-1
dest/A/B/file-2
dest/A/B/file-3
dest/A/B/C
dest/A/B/C/file-4
dest/A/B/C/file-5

patch/
patch/A
patch/A/B
patch/A/B/file-2
patch/A/B/C
patch/A/B/C/file-6

... to czy mogę uruchomić jakieś polecenie find / copy / xargs / sed piped, które skopiuje każdy plik z katalogu poprawki do odpowiedniej lokalizacji w katalogu docelowym? Gdybym tylko cp -r patch/A/B dest/A/Bwtedy będę tracić pliki dest/A/B/file-1i dest/A/B/file-3etc.

Edytować:

Próbowałem sobie np Uruchamianie poleceń find -type f | xargs -I {} cp {} ..., ale nie jestem bardzo doświadczonych z poleceń powłoki i nic nie działało (the ...na końcu polecenia jest przeważnie były eksperymenty z sed przekształcić filepath zastępując ./z dest/).

RTF
źródło

Odpowiedzi:

3

Możesz po prostu użyć rsync, aby to osiągnąć; rsync -Aax /input/directory/path /output/directory/path (pamiętaj, że flagi zachowają uprawnienia właściciela, grupy i bezpieczeństwa).

Trzeba dodać, że swoje oświadczenie, z którego wierzę całe Problem powstaje, „Gdybym tylko cp -r patch/A/B dest/A/Bwtedy będę tracić pliki dest/A/B/file-1i dest/A/B/file-3etc” nie jest dokładna; możesz także po prostu uruchomić cp -r patch/A dest/A/i osiągnąć to, czego szukasz (żadne istniejące pliki nie zostaną usunięte)

BE77Y
źródło
To świetny pomysł. Nie używam rsync normalnie, ale zawsze myślałem o tym jako o alternatywie dla scp
RTF
To fantastyczne narzędzie, z pewnością warte twojego czasu. Zobacz także mój dodany komentarz, który właśnie edytował mój post.
BE77Y,
Masz oczywiście rację co do tego cp -r patch/A/* .... Nie rozumiem jednak, dlaczego to działa z globem plików. To, co się dzieje, różni się w porównaniu z tym cp -r patch/A dest/A. Czy symbol wieloznaczny jest interpretowany jako „powtarzaj przez każdy podkatalog, ale tylko kopiuj pliki”?
RTF
Nie - to mój zły nawyk. Możesz równie dobrze wykonać cp -r patch/A dest/z tymi samymi wynikami (pamiętaj tylko, aby dodać końcowy ukośnik do miejsca docelowego, aby oznaczyć jego status jako katalogu). Edytowano zgodnie z powyższą metodą „najlepszych praktyk”.
BE77Y,