Копирование файлов из какого-либо места в дереве каталогов в папку

У меня есть зеркало большого сайта, который мне нужно реорганизовать, большинство изображений и файлов, которые я смог программно переместить и связать; однако, есть несколько (несколько - это относительный термин, мы говорим о 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\

должен сделать работу за вас.

Другие вопросы по тегам