Вопрос: Команда Unix для рекурсивного копирования файлов


Мне нужна команда unix для следующего:

Структура каталога

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

Я бы хотел, чтобы одна команда скопировала все файлы *, а не папки из каталога «images», рекурсивно на что-то вроде этого.

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

Я попробовал это, но он просто скопировал папки рекурсивно cp -r ./project/images/* ./assets/


2
2018-04-23 17:43


Источник


Я только что нашел это, и он работает find project -type f -exec cp {} assets \; - ThomasReggi
Отправьте свое решение в качестве ответа. Ответ на ваши вопросы не только принимается, но поощряла, Я бы рекомендовал, однако, что вы цитируете {} поэтому у вас не будет проблем с именами файлов с пробелами: find project/images -type f -exec cp '{}' assets \; - terdon
@terdon {} не нужно указывать, - user495470
@LauriRanta Я стою исправлен, спасибо. - terdon


Ответы:


Это выполняет cp для каждого файла, поэтому он может быть заметно медленнее, если есть много небольших файлов (но не с типичными изображениями):

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

Это принимает несколько аргументов за раз:

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

Без -0 имена файлов, которые содержат одинарные кавычки или двойные кавычки, приведут к ошибке, например xargs: unterminated quote,

Bash 4 опоры ** с shopt -s globstar:

cp project/**/*.jpg assets

6
2018-04-23 18:15