В среде Unix я бы использовал find
или rsync
(и, возможно, некоторые функции оболочки). Cygwin и MinGW поставляются с find
, возможно с rsync
. Вы также можете, вероятно, получить отдельный порт find
для Windows где-нибудь.
Если переменная оболочки SOURCE
является каталогом, содержащим подкаталоги с файлами для копирования, а переменная оболочки DEST
является каталогом, в который они копируются:
find $SOURCE -name \*.jpg -exec cp --update \{\} $DEST/ \;
find
по своей природе рекурсивен. «-name \*.jpg
» выбирает файлы, соответствующие этому шаблону. Вы можете добавить дополнительные условия с помощью -и. Параметр --update
для команды cp
(или -u) копирует файл, только если он был изменен или еще не скопирован. Есть и другие варианты cp
, которые тоже могут быть полезны.
Если $ SOURCE совпадает с $ DEST, как в вашем примере DIR / DIR /, то find также найдет файлы назначения (уже скопированные), хотя это будет нормально, cp распознает, что вы пытаетесь скопировать тот же самый файл и пропустите его, но если вы хотите избежать этой потраченной впустую работы, вы можете использовать 'for' и 'if' (или что-то), чтобы запускать find только в подкаталогах DIR / DIR /.
Вы также можете использовать rsync, у которого есть опции, позволяющие удалять файлы из целевого каталога, если они также были удалены из исходного каталога, и многие другие подобные варианты.