Komenda Uniksa do rekurencyjnego kopiowania plików

2

Potrzebuję polecenia unix dla następujących elementów:

Struktura katalogów

/project
    /images
        /products
            /cup.jpg
            /laptop.jpg
        /designs
            /alpha.jpg
            /beta.jpg
            /gamma.jpg
        /team
            /jeff.jpg
        /locations
            /new-york.jpg

Chciałbym, aby jedno polecenie kopiowało rekursywnie wszystkie pliki *, a nie foldery z katalogu „images” do czegoś takiego.

/assets
    /cup.jpg
    /laptop.jpg
    /alpha.jpg
    /beta.jpg
    /gamma.jpg
    /jeff.jpg
    /new-york.jpg       

Próbowałem tego, ale tylko rekursywnie skopiowałem foldery cp -r ./project/images/* ./assets/

ThomasReggi
źródło
4
Właśnie to znalazłem i działafind project -type f -exec cp {} assets \;
ThomasReggi,
Prześlij swoje rozwiązanie jako odpowiedź. Odpowiedzi na własne pytania są nie tylko akceptowane, ale zachęcane . Polecam jednak zacytować {}, abyś nie miał problemów z nazwami plików ze spacjami:find project/images -type f -exec cp '{}' assets \;
terdon
@terdon {} nie musi być cytowany .
Lri 24.04.13

Odpowiedzi:

6

Wykonuje to cp dla każdego pliku, więc może być zauważalnie wolniejsze, jeśli istnieje wiele małych plików (ale nie z typowymi obrazami):

find project -name \*.jpg -exec cp {} assets \;

To wymaga wielu argumentów jednocześnie:

find project -name \*.jpg -print0 | xargs -0 -I% cp % assets

Bez -0 nazw plików zawierających pojedyncze cudzysłowy lub podwójne cudzysłowy spowodowałoby błąd podobny do xargs: unterminated quote.

Bash 4 obsługuje **z shopt -s globstar:

cp project/**/*.jpg assets
Lri
źródło