Copiando arquivos de algum lugar dentro de uma árvore de diretórios para uma pasta

1

Eu tenho um espelho de um site grande que preciso reorganizar, a maioria das imagens e arquivos que eu consegui mover e vincular programaticamente; no entanto, existem alguns (poucos é um termo relativo, estamos falando de 3.000 arquivos estranhos) Eu preciso localizar dentro da confusão de pastas.

Eu sei o (s) nome (s) do arquivo (tenho grandes listas longas e suponho que sejam exclusivas, ou pelo menos únicas o suficiente para corrigir qualquer colisão manualmente), mas não a localização delas na estrutura de arquivos e precisa copiá-los para um diretório separado para que eu possa enviá-los.

Em suma, tenho uma lista como

file1.jpg
file2.doc
file4.ppt
filesomethingelse.this

em um arquivo (digamos, filelist.txt ).

E eu tenho uma estrutura de pastas como

folder\subfolder\file1.jpg
folder\subfolder\file2.doc
folder\subfolder2\filesomethingelse.this
folder\file3.jpg
folder\file4.ppt

e eu quero pegar

secondFolder\file1.jpg 
secondFolder\file2.doc
secondFolder\file4.ppt 
secondFolder\filesomethingelse.this

Observe que file3.jpg não deve ser copiado porque não está na lista.

Algo de linha de comando como (xcopy ou robocopy) seria a melhor opção, eu acho, então posso agrupar as solicitações.

Espero que isso faça sentido.

    
por Heather Herbert 07.09.2015 / 18:23

2 respostas

2

Se você deseja copiar apenas os arquivos cujos nomes estão listados em filelist.txt , e pular arquivos que não são (por exemplo, file3.jpg em seu exemplo), faça

for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && copy %f secondfolder
  • %f é atribuído ao nome do caminho completo de cada arquivo em folder ; %~nxf extrai o nome e a extensão (isto é, o nome do arquivo base; tudo após o último \ ).
  • @ suprime a exibição do seguinte comando. Isso é cosmético e discricionário. Além disso, é desnecessário se você colocar este comando em um arquivo de lote e começar com @echo off .
  • findstr procura por uma string (ou padrão) em um arquivo (ou outro conjunto de dados); é essencialmente o equivalente do grep do Windows. Usamos para determinar se cada nome de arquivo está na lista de nomes de arquivos, %código%.
    • filelist.txt - faz distinção entre maiúsculas e minúsculas. Você pode deixar isso de lado se tiver certeza de que sua lista possui letras maiúsculas corretas.
    • /i - Corresponde a linha inteira (como /x ). Isso evita que nomes de arquivos como grep -x correspondam a le2.do .
  • file2.doc - equivalente a > nul ; isso impede que a saída de > /dev/null seja exibida. (Claro que isso é só para evitar desordenar a tela e é opcional.)
  • findstr - Faz o próximo comando ( && ) se o comando anterior ( copy ) foi bem-sucedido. ( findstr é bem-sucedido se encontrar uma correspondência; isto é, se o nome do arquivo estiver na lista.)
  • Se você tem algum nome de arquivo com personagens engraçados, você pode precisar colocar o último findstr entre aspas ( %f ) e talvez mude o comando "%f" .
  • Antes de executar este comando de verdade, talvez você queira alterar findstr para copy , então você pode fazer uma corrida a seco e ver o que o comando fará.
  • Se você colocar o comando em um arquivo de lote, altere todas as ocorrências de echo copy para % .
  • Se você deseja obter uma listagem (log) de onde os arquivos foram encontrados, faça
for /r folder %f in (*) do @findstr/i /x "%~nxf" filelist.txt > nul && (echo %f & copy %f secondfolder)
    
por 08.09.2015 / 02:35
2

Eu acho que isso:

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

deve fazer o trabalho para você.

    
por 07.09.2015 / 18:39