Copiando arquivos com determinados nomes de uma lista

2

Eu tenho um diretório com milhares de arquivos nomeados como número .jpg (ex: 100152.jpg, 100153.jpg). Não quero copiar tudo neste diretório - apenas os arquivos com o nome exato como os nomes em uma lista de arquivos de texto que eu criei.

Existem cerca de 36k nomes nesta lista mais curta - desejo copiar todos os arquivos no diretório grande com os mesmos nomes que os da lista em uma pasta separada.

Como eu seria capaz de fazer isso sem ir um a um em um sistema Windows ?

Andrew Zhang
fonte
Esta pergunta pode ajudar a esclarecê-lo?
simlev 01/08/19

Respostas:

2

Você pode usar um FOR / F e referenciar o caminho completo da lista de arquivos, como mostrado abaixo.

Isso essencialmente lerá cada linha da lista de arquivos para a qual você aponta, linha por linha e itera o valor retornado (conteúdo de cada linha) ao comando XCOPY para processar adequadamente.

Sintaxe da linha de comando

FOR /F "USEBACKQ TOKENS=*" %F IN ("C:\Folder\FileList.txt") DO XCOPY /F /Y "C:\SourceFolder\%~F" "C:\DestinationFolder\"

Sintaxe de script em lote

@ECHO ON

SET FileList=C:\Folder\FileList.txt
SET Source=C:\SourceFolder
SET Destination=C:\DestinationFolder

FOR /F "USEBACKQ TOKENS=*" %%F IN ("%FileList%") DO XCOPY /F /Y "%Source%\%%~F" "%Destination%\"

GOTO :EOF

Notas da lógica do script

  • A USEBACKQopção usada no loop FOR garantirá que a lista de arquivos ainda possa ser lida se o nome da lista de arquivos ou seu caminho tiver algum espaço e você precisar citar duas vezes o caminho da lista de arquivos

    • Por exemplo SET FileList=C:\Folder Name\File List.txt
      • Sem o USEBACKQdo PARA circuito seria erro fora em um caso como este
  • A TOKENS=*opção usada no loop FOR garantirá que o valor inteiro seja retornado conforme é lido na lista de arquivos, mesmo que esse valor tenha um espaço nele

    • Por exemplo, lista de arquivos tem um valor de File 00 11.jpgmodo que o valor tenha um espaço em uma linha

      • Sem o TOKENS=*o PARA circuito apenas voltar a porção valor de linha que antes do primeiro espaço e não o valor esperado (ie File)

O uso dessas opções, mesmo quando não necessário, não parece causar nenhum dano e, se você introduzir esse valor ou variável na mistura do script, ele já poderá lidar com esses casos adequadamente.


Recursos adicionais

Pimp Juice IT
fonte
1

Eu usaria a bashqualquer momento.

cat list.txt | xargs -I {} cp {} <destination folder>

Ou, desde que eu tenho vindo a preferir parallelmais xargs:

cat list.txt | parallel cp {} <destination folder>

No Windows, eu usaria o cygwin , mas você pode considerar cmder , Git-for-Windows , WSL e mais ...


Mas você pode fazer isso com a mesma facilidade em Powershell:

cat list.txt  | ForEach {cp $_ <destination folder>}

Aparentemente, a Microsoft deseja que uma determinada categoria de usuários se sinta à vontade usando o Powershell, porque reconhece vários comandos conhecidos do mundo UNIX. Esses são apenas aliases para os cmdlets equivalentes e uma lista pode ser encontrada invocando Get-Alias(ou simplesmente aliasse você preferir):

cat -> Get-Content
clear -> Clear-Host
cp -> Copy-Item
curl -> Invoke-WebRequest
diff -> Compare-Object
echo -> Write-Output
history -> Get-History
kill -> Stop-Process
ls -> Get-ChildItem
man -> help
mount -> New-PSDrive
mv -> Move-Item
pwd -> Get-Location
rm -> Remove-Item
sleep -> Start-Sleep
wget -> Invoke-WebRequest
simlev
fonte