listar todos os arquivos em todos os subdiretórios, não no diretório atual

0

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.

yky
fonte

Respostas:

2

Use o Powershell:

 Get-ChildItem .\*\*

Editar:

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}
humble.adm1n
fonte
+1 A melhor resposta que vi, e não usa arquivos em lote (e o OP não pediu arquivos em lote, apenas para poder fazer isso em lotes).
Hennes
@Hennes Eu tenho um nitpick, por favor, verifique minha resposta atualizada.
guest-vm
@guest Eu não posso comentar o seu post, então aqui. 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 segundo foreach e acelerá-lo fazendo Get-ChildItem -Directory | ForEach-Object {Get-ChildItem -Recurse | Select-Object FullName} ou realmente curto ls -Dir | % {ls -rec | select fullname}
humble.adm1n
agradeço por dicas (na verdade eu apenas liguei o powershell em resposta à sua resposta). Contudo dir -recurse *\* não lista arquivos dir atuais para mim, testados no W10 PoSh
guest-vm
1

Existem 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, executando dir /b /s para cada diretório. Desde a for 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=" instrui for /f não para tokenize uma linha, mas atribuir a linha inteira para %i. for /f em seguida, percorre todas as linhas, executando dir /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}

guest-vm
fonte
Embora isso possa responder à pergunta, seria uma resposta melhor se você pudesse fornecer alguma explicação porque isso acontece.
DavidPostill
@ David feito, corrija-me se estou errado, sinta-se à vontade para editar.
guest-vm