1

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

2

Я думаю это:

for /R c:\source %f in (*) do copy "%f" x:\destination\

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

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)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .