Existe uma maneira de listar todos os arquivos em todos os subdiretórios, exceto aqueles no diretório atual?
dir /s /b
lista todos os arquivos, incluindo aqueles no diretório atual. Isso não é o que eu quero.
Use o Powershell:
Get-ChildItem .\*\*
Acima de exemplo, na verdade só obtém o segundo nível ou diretórios e não o conteúdo das subpastas.
@ resposta do hóspede é a melhor:
Get-ChildItem -Directory | ForEach-Object {Get-ChildItem -Recurse | Select-Object FullName}
dir -recurse *\*
listar o conteúdo do diretório atual. Não é isso que o OP quer. Seu segundo exemplo do PoSh é certo e melhor que a minha resposta. Você pode largar o segundoforeach
e acelerá-lo fazendoGet-ChildItem -Directory | ForEach-Object {Get-ChildItem -Recurse | Select-Object FullName}
ou realmente curtols -Dir | % {ls -rec | select fullname}
dir -recurse *\*
não lista arquivos dir atuais para mim, testados no W10 PoShExistem várias soluções, que tentarei explicar uma por uma.
Lote
1)
for /d %i in (*) do @dir /b /s "%i"
(*)
expande para todos os arquivos no diretório atual.for /d
então percorre todos os diretórios, excluindo arquivos regulares, executandodir /b /s
para cada diretório. Desde afor
echos executados comandos,@
é usado para suprimir o eco.2)
for /f "delims=" %i in ('dir /b /A:D') do @dir /b /s "%i"
'dir /b /A:D'
retorna todos os diretórios no diretório atual, com cada diretório em uma linha."delims="
instruifor /f
não para tokenize uma linha, mas atribuir a linha inteira para%i
.for /f
em seguida, percorre todas as linhas, executandodir /b /s
para cada linha.Usar
%%i
ao invés de%i
no arquivo em lotes.Powershell
dir *\*
retorna apenas arquivos nos diretórios de nível 2.dir -recurse *\*
também retorna arquivos em diretórios mais profundos, mas não mostra a pasta vazia no nível 2.Comandos corretos que adotam a mesma abordagem em relação a Lote :
1)
dir | where {$_.PsIsContainer} | foreach {dir -recurse $_} | foreach {echo $_.fullname}
2)
dir -directory | foreach {dir -recurse $_} | foreach {echo $_.fullname}
fonte