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