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/


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.