Скопируйте дерево каталогов в один каталог в командной строке - PullRequest
4 голосов
/ 13 мая 2009

Кто-нибудь знает утилиту командной строки (или ту, которая может работать как командная строка), которая собирает все файлы .jpg из дерева каталогов в одну папку, копируя только изменяемые файлы?

Я начал с Renamer , который отлично подходит для переименования файлов в их текущих каталогах, но потерпел неудачу, когда попытался изменить путь. Вероятно, это потому, что я не очень хорошо знаю Renamer. Я закончил тем, что создал дамп каталога текстовых файлов, а затем использовал поиск / замену REGEX для создания командного файла, но это вряд ли эффективно и не автоматизировано.

REGEX:

(G: \ DIR \ DIR \) ([0-9] + \) ([0-9] + \) ([0-9] + \) ([0-9] + \) (р [0-9] +. JPG)

изменил это

G: \ DIR \ DIR \ 00 \ 00 \ 00 \ 00 \ p0000000000.jpg

к этому

G: \ DIR \ DIR \ p0000000000.jpg

(копия \ 1 \ 2 \ 3 \ 4 \ 5 \ 6 \ 1 \ 6) в командном файле.

Мне нужно запустить все это как запланированную задачу без входа в систему реального пользователя. На самом деле не ищу файл Zip, потому что я не хочу беспокоить системный процессор, плюс большинство файлов не будут меняться со дня сегодня. Это скорее синхронизация файлов.

Ответы [ 3 ]

7 голосов
/ 13 мая 2009

В командной строке Windows вы можете сделать это:

for /R A %i IN (*.jpg) DO xcopy %i B /M /Y

Где A - исходный каталог, а B - целевой каталог. Вам необходимо включить расширения команд, которые, по моему мнению, являются значениями по умолчанию.

0 голосов
/ 13 мая 2009

В среде 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, у которого есть опции, позволяющие удалять файлы из целевого каталога, если они также были удалены из исходного каталога, и многие другие подобные варианты.

0 голосов
/ 13 мая 2009

Я предполагаю, что вы находитесь в Windows из формата пути.

Я не все прочитал, но http://www.infionline.net/~wtnewton/batch/batguide.html#6a может помочь вам.

На этой же странице есть dizzy.bat, (http://www.infionline.net/~wtnewton/batch/dizzy.bat), который нужно легко редактировать, чтобы сделать то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...