Copie nomes de arquivos com um certo número de caracteres na linha de comando (CMD)

5

Eu preciso copiar todos os arquivos de texto em uma pasta cujos nomes tenham cinco caracteres. Eu sei que este comando é para listagem:

$ dir folder /B | findstr /R "^.....\.txt"

mas eu quero copiar todos os arquivos cujos nomes estão listados pelo comando acima para uma pasta diferente.

    
por Stefano Manolo Costantini Ragn 11.10.2015 / 22:31

5 respostas

5

Eu estava perguntando (não só para mim) "não funciona um simples ..." ?

copy  C:\ORIG_DIR\?????.txt C:\Dest_Dir

Graças ao G-Man é testado que no powershell funciona , enquanto cmd.exe o comando acima copia cada correspondência até cinco caracteres e com toda a extensão que começa com .txt .

Question mark (?)

Use the question mark as a substitute for a single character in a name. For example, if you type gloss?.doc, you will locate the file Glossy.doc or Gloss1.doc but not Glossary.doc.

Referência:

por 12.10.2015 / 07:12
1

Isso é possível no Batch, mas é fácil no PowerShell.

ls | foreach { if (($_.BaseName.Length -eq 5) -and ($_.Extension -eq ".txt")) 
    { $_.CopyTo("\Name\Of\Target\Folder\" + $_.Name) }

Você também pode fazer isso verificando os nomes dos arquivos em relação a uma expressão regular, mas esse método funciona bem.

    
por 12.10.2015 / 00:06
1

No Batch, você poderia fazer algo assim:

@Echo OFF

Set "targetDir=C:\Dir"

For %%# In ("*.txt") DO (

    (Echo "%%~nx#" | findstr /R "^......\.")1>Nul 2>&1 && (

        Echo Copying "%%~nx#" ...
        (Copy /Y "%%~f#" "%targetDir%\%%~nx#")1>NUL

    )
)

Pause&Exit /B 0
    
por 12.10.2015 / 00:08
1

Veja outra abordagem em lote:

@echo off
setlocal enabledelayedexpansion
for %%f in (*.txt) do (
      set foo=%%f
      set foo=!foo:~5,5!
      if !foo!==.txt (
            (This filename (%%f) matches the pattern ?????.txt; do what you want with it.)
      )
)

O !foo:~5,5! é uma instância do %código% mecanismo de substring; ele extrai a substring do nome do arquivo a partir do 6º caractere (offset 5) e com um comprimento de 5 (o suficiente para capturar !variable:~offset:length! mais um caractere, se houver mais). Então variável .txt tem o valor foo se o 6º, 7º, 8º e 9º caracteres do nome do arquivo são .txt , . , t e x e não há 10º caractere.

    
por 12.10.2015 / 04:31
1

Para testar com echo no one-liner (deve funcionar com a subpasta se você adicionar o comando /s in dir )

for /f "delims=" %a in ('dir /b /a-d "?????.txt"^|findstr /R "\.....\.txt$"') do @echo %~fa

comando de cópia de uma linha

for /f "delims=" %a in (
'dir /b /a-d "?????.txt"^|findstr /R "\.....\.txt$"'
) do @copy  "%~fa" "destination-dir"

Arquivo em lote

for /f "delims=" %%a in (
  'dir /b /a-d "?????.txt"^|findstr /R "\.....\.txt$"'
) do (
  copy  "%%~fa" "destination-dir"
)

Editar :

/a-d digitalizar arquivos
/ad digitalizar pastas
Sem /a[d|-d] , ele fará a varredura de ambos veja dir /? para mais leituras

Se eu adicionei "?????.txt" no comando " dir " é reduzir o escopo da verificação e, assim, reduzir o tempo de verificação. Você sempre pode expandir o escopo da verificação no comando " dir ", mas o mais importante é o padrão no comando " findstr "

Alterei "^.....\.txt" para "\.....\.txt$" para poder digitalizar o nome da pasta.

.   Wildcard: any character
ˆ   Line position: beginning of line
$    Line position: end of line
\.  Escape: literal use of metacharacter .

Veja findstr /? para ler mais

Por que não funciona em alguns casos? Como não há solução universal, você precisa adaptar o comando ao seu caso. Se você usar / b sem / s, o comando dir produzirá uma saída sem barra \ , portanto, o padrão findstr com \ falhará.

Isso falhará : dir /b "*.txt"|findstr /R "\........$"
Quando isso vai sucesso : dir /b "*.txt"|findstr /R "^........$"

Assim como com um comando dir que produz uma saída quando a palavra padrão de pesquisa está no final da linha separada por uma barra à direita também falhará.

Como isso falhará : dir /b /s "*.txt"|findstr /R "^........$"
mas isso irá sucesso : dir /b /s "*.txt"|findstr /R "\........$"

    
por 12.10.2015 / 12:12