Obter nomes de arquivos nus recursivamente no prompt de comando

19

Eu encontrei um pequeno problema, tentando obter apenas os nomes de arquivos (sem extensões ou caminhos de arquivos) recursivamente. Isso funcionou para mim na pasta raiz:

dir /b

Mas quando adicionei / s para verificar recursivamente, também obtive caminhos de arquivos antes dos nomes de arquivos que não quero. Existe uma maneira de obter nomes de arquivos simples de todas as subpastas em um diretório?

Estou no Windows 7 x64 Eu prefiro usar o prompt de comando regular, não PS ou VBS

TMRW
fonte

Respostas:

15

Use o seguinte comando:

dir /b /a /s
  • / b retira a data e outros detalhes da saída
  • / a apenas gera o nome do arquivo, sem caminhos
  • / s permite uma listagem de diretório recursiva

Se você precisar salvar a saída em um arquivo, poderá usar:

dir /b /a /s >> list_of_names.txt

EDIT Na verdade, a solução acima não atinge os objetivos da pergunta original. Uma coisa que notei na pergunta é que a postagem solicita uma listagem recursiva. que falta na outra resposta, então eu acho que adicionar "/ s" na resposta da outra pessoa responderá

for /f %a in ('dir /b /s') do @echo %~na
Nik So
fonte
Você poderia explicar isso? Para mim, faz pouco sentido.
Simon Sheehan
4
Isso não funciona, / a não funciona assim - é um filtro para o tipo de arquivo que você deseja listar. Não remove o caminho do nome do arquivo ao fazer uma listagem de diretório recursiva.
Gaff
editou a resposta; e só tenho minhas mãos em um Windows caixa novamente, acho que desta vez deve fazê-lo (win732bit)
Nik Então,
6

Tente o seguinte:

for /f "delims=" %a in ('dir /b /s') do @echo %~na

Para obter mais informações sobre como funciona e o que está fazendo, digite for /?

Multiverse IT
fonte
Esta quase funciona, mas há uma grande problem.It somente mostra a primeira palavra de uma filename.If um nome de arquivo é "a minha imagem Férias 1", por exemplo, então ele só saídas "meu"
tmrw
tente o seguinte: para / f "delims = |" % a em ('dir / b') do @echo% ~ na. Por padrão, o parâmetro / f de FOR irá simbolizar os espaços. Definir o token para um caractere que não deve aparecer nos nomes de arquivo / diretório fornecerá o nome inteiro, incluindo espaços.
97811 Scott McKinney #
Se você deseja que a saída seja enviada para um arquivo, acrescente>> filename.txt
Gruber
2
for /r %i in (*) do @echo %~ni

ou

forfiles /s /c "cmd /c if @isdir==FALSE noquotes.bat @fname"

assumindo um arquivo noquotes.batno seu % PATH% com este conteúdo

@echo %~1

abordagem for / r explicada

for /rpercorre o diretório atual recursivamente (você pode especificar um diretório for /r drive:\path\, o diretório atual é assumido) e executa o comando especificado por do para cada arquivo encontrado no conjunto (*). O conjunto (.)corresponderia apenas aos diretórios. @echo% ~ ni Este comando funciona como está no prompt. Dobrar suas cotações, se você colocá-lo dentro de um arquivo em lotes. iefor /r %%i in (*) do @echo %%~ni

abordagem forfiles explicada

/senumera os subdiretórios atual e todos os subdiretórios
/cexecuta o comando dentro das aspas
@isdire @fnameé um símbolo emitido na cadeia de comando
O arquivo em lotes extra noquotes.batajuda ao eliminar as aspas duplas com% ~ 1 (parâmetro 1)
forfilestambém permite especificar um caminho para iniciar emforfiles /P C:\Windows ...

JJS
fonte
@DavidPostill sim, foi uma resposta ruim. Obrigado por seus comentários. Informe-me se posso melhorar minha resposta ainda mais.
JJS 26/07
@DavidPostill você não tem resposta ou comentário anterior. você estava moderando perguntas ou procurando uma resposta e tropeçou na minha resposta de baixa qualidade?
JJS 26/07
Sua resposta apareceu na fila de revisão "Postagens de baixa qualidade". Como eu sei muito sobre arquivos em lotes, eu me aproximei.
DavidPostill
Obrigado por sua avaliação. Congratulo-me com a sua revisão das alterações que fiz na minha resposta.
JJS 27/07
Muito melhor ... :)
DavidPostill
-1

Listar todos os arquivos, nus, recursivamente, usando atributos (não diretório) (somente arquivos)

dir / B / S / A: -D

C: \ teste \ cache> dir / B / S / A: -D

C: \ test \ cache \ 7 \ 0f \ 7b50ed0522645513da90345120eaf0f7 C: \ test \ cache \ d \ 23 \ 814644aa6a8195c91e54d2f7bb64e23d

Brandon Hunt
fonte
A pergunta diz que o OP está “tentando obter apenas os nomes dos arquivos (sem extensões ou caminhos de arquivo). … Mas quando [tentei dir /b /s] digitalizar recursivamente, também obtive caminhos de arquivos antes dos nomes dos arquivos, o que não quero. ”Então, você está dizendo ao OP para tentar uma variação trivial do que eles já tentaram, e sua resposta demonstra que produz o mesmo resultado de quando o OP tentou (ou seja, não o que eles querem).
Scott Scott