Копіювання файлів десь із дерева каталогів у папку


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

Якщо ви хочете скопіювати лише ті файли, чиї імена вказані у списку 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)

2

Я думаю це:

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

повинен зробити роботу за вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.