Копирование файлов из какого-либо места в дереве каталогов в папку
У меня есть зеркало большого сайта, который мне нужно реорганизовать, большинство изображений и файлов, которые я смог программно переместить и связать; однако, есть несколько (несколько - это относительный термин, мы говорим о 3000 нечетных файлах), которые мне нужно найти в куче папок.
Я знаю имя файла (ов) (у меня есть большие длинные списки, и я предполагаю, что они уникальны или, по крайней мере, достаточно уникальны, чтобы я мог исправить любое столкновение вручную), но не их расположение в структуре файла, и мне нужно скопировать их в отдельный каталог, чтобы я мог затем загрузить их.
Короче, у меня есть список как
file1.jpg
file2.doc
file4.ppt
filesomethingelse.this
в файле (скажем, filelist.txt
).
И у меня есть структура папок, как
folder\subfolder\file1.jpg
folder\subfolder\file2.doc
folder\subfolder2\filesomethingelse.this
folder\file3.jpg
folder\file4.ppt
и я хочу получить
secondFolder\file1.jpg
secondFolder\file2.doc
secondFolder\file4.ppt
secondFolder\filesomethingelse.this
Обратите внимание, что file3.jpg
не следует копировать, потому что его нет в списке.
Думаю, что-то вроде командной строки (xcopy или robocopy) было бы лучшим вариантом, поэтому я могу группировать запросы.
Надеюсь, это имеет смысл.
2 ответа
Если вы хотите скопировать только те файлы, имена которых указаны в filelist.txt
и пропустить файлы, которые не являются (например, file3.jpg
в вашем примере), сделать
for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && copy %f secondfolder
%f
присваивается полный путь к каждому файлу вfolder
;%~nxf
извлекает имя и расширение (то есть базовое имя файла; все после последнего\
).@
подавляет отображение следующей команды. Это косметическое и дискреционное. Кроме того, нет необходимости, если вы поместите эту команду в командный файл и начнете с@echo off
,findstr
ищет строку (или шаблон) в файле (или другом наборе данных); это по сути Windows эквивалентgrep
, Мы используем его, чтобы определить, есть ли каждое имя файла в списке имен файлов,filelist.txt
,/i
- Делайте сравнение без учета регистра. Вы можете оставить это, если вы уверены, что ваш список имеет правильную прописную букву./x
- Совпадение всей линии (например,grep -x
). Это предотвращает имена файлов, такие какle2.do
из соответствияfile2.doc
,
> nul
- эквивалентно> /dev/null
; это предотвращает выход изfindstr
от отображения. (Конечно, это просто, чтобы не загромождать экран, и не является обязательным.)&&
- сделать следующую команду (copy
) если предыдущая команда (findstr
) удалось. (findstr
успешно, если он находит совпадение; то есть, если имя файла находится в списке.)- Если у вас есть какие-либо имена файлов с забавными символами в них, вам может понадобиться поставить последний
%f
в кавычки ("%f"
) и, возможно, изменитьfindstr
команда. - Прежде чем вы запустите эту команду по-настоящему, вы можете изменить
copy
вecho copy
, так что вы можете выполнить пробный прогон и посмотреть, что будет делать команда. - Если вы поместите команду в командный файл, измените все вхождения
%
в%%
, - Если вы хотите получить список (журнал), где файлы были найдены, вы можете сделать
for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && (echo %f & copy %f secondfolder)
Я думаю это:
for /R c:\source %f in (*) do copy "%f" x:\destination\
должен сделать работу за вас.