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 "\........$"