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 ). Eu 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 - eu quero copiar todos os arquivos no diretório grande que possuem os mesmos nomes que os da lista em uma pasta separada.

Como eu seria capaz de fazer isso sem passar um por um em um sistema Windows ?

    
por Andrew Zhang 01.08.2017 / 17:01

2 respostas

2

Você pode usar um FOR / F e fazer referência ao 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 iterará o valor retornado (conteúdo de cada linha) para o XCOPY comando para processar em conformidade.

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

Script Logic Notes

  • The USEBACKQ option used in the FOR loop will ensure the file list can still be read if the file list name or it's path has any spaces in it and you need to double quote the file list path

    • E.g. SET FileList=C:\Folder Name\File List.txt
      • Without the USEBACKQ the FOR loop would error out in a case like this
  • The TOKENS=* option used in the FOR loop will ensure the the entire value is returned as it's read from the file list even if that value has a space in it

    • E.g. File list has a value of File 00 11.jpg so the value has a space on a line

      • Without the TOKENS=* the FOR loop would only return the value portion of that line before the first space and not the value as expected (i.e. File)

Using these options even when not needed does not seem to cause any harm and should you ever introduce such a value or variable into the mix of the script, it'd already be able to handle such cases accordingly.

Mais recursos

por 01.08.2017 / 19:53
1

Eu usaria bash a qualquer momento.

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

Ou, desde que eu tenha preferido parallel por xargs :

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

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

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

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

Aparentemente, a Microsoft quer que uma certa categoria de usuários se sinta à vontade usando o Powershell, porque reconhece vários comandos bem conhecidos do mundo UNIX. Esses são apenas aliases para os cmdlets equivalentes e uma lista pode ser encontrada invocando Get-Alias (ou simplesmente alias se 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
    
por 01.08.2017 / 17:37