Ottieni ricorsivamente nomi di file nudi nel prompt dei comandi


19

Mi sono imbattuto in un piccolo intoppo nel tentativo di ottenere ricorsivamente solo i nomi di file (senza estensioni o percorsi di file). Questo ha funzionato per me nella cartella principale:

dir /b

Ma quando ho aggiunto / i per la scansione ricorsiva ho anche ottenuto percorsi di file prima dei nomi di file che non voglio. C'è un modo per ottenere i nomi di file nudi da tutte le sottocartelle in una directory?

Im su Windows 7 x64 Preferirei utilizzare il normale prompt dei comandi non PS o VBS

Risposte:


15

Utilizzare il comando seguente:

dir /b /a /s
  • / b rimuove la data e altri dettagli dall'output
  • / a genera solo il nome file, nessun percorso
  • / s abilita un elenco di directory ricorsivo

Se è necessario salvare l'output in un file, è possibile utilizzare:

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

MODIFICA In realtà la soluzione di cui sopra non raggiunge gli obiettivi della domanda originale. Una cosa che ho notato dalla domanda è che il post richiede un elenco ricorsivo. cui manca l'altra risposta, quindi penso che l'aggiunta di "/ s" nella risposta dell'altro risponditore farà il trucco

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

Potresti spiegarlo? Per me ha poco senso.
Simon Sheehan,

4
Questo non funziona, / a non funziona così - è un filtro per il tipo di file che desideri elencare. Non elimina il percorso dal nome file quando si esegue un elenco ricorsivo di directory.
Gaff,

modificato la risposta; e ho appena messo di nuovo le mani su una finestra di Windows, penso che questa volta dovrebbe farlo (win732bit)
Nik So

6

Prova questo:

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

Ulteriori informazioni su come funziona e cosa sta facendo, digitare for /?


Funziona quasi, ma c'è un grosso problema. Emette solo la prima parola di un nome di file. Se un nome di file è ad esempio "la mia immagine di vacanza 1", quindi restituisce solo "mio"
TMRW

prova questo: per / f "delims = |" % a in ('dir / b') do @echo% ~ na. Per impostazione predefinita, il parametro / f di FOR verrà tokenizzato sugli spazi. L'impostazione del token su un carattere che non dovrebbe apparire nei nomi di file / directory ti darà l'intero nome inclusi gli spazi.
Scott McKinney,

Se si desidera che l'output venga inviato a un file, aggiungere>> filename.txt
Gruber

2
for /r %i in (*) do @echo %~ni

o

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

assumendo un file noquotes.batnel tuo % PATH% con questo contenuto

@echo %~1

per l'approccio / r spiegato

for /rcammina ricorsivamente la directory corrente (è possibile specificare una directory for /r drive:\path\, si presume la directory corrente) ed esegue il comando specificato da do per ciascun file corrispondente nel set (*). Il set (.)corrisponderebbe solo alle directory. @echo% ~ ni Questo comando funziona così com'è dal prompt. Raddoppia le virgolette se le inserisci in un file batch. vale a direfor /r %%i in (*) do @echo %%~ni

spiegazione dell'approccio forfile

/senumera le sottodirectory correnti e tutte
/cesegue il comando all'interno delle virgolette
@isdired @fnameè un simbolo emesso nella stringa di comando
Il file batch aggiuntivo noquotes.bataiuta a rimuovere le virgolette doppie con% ~ 1 (parametro 1)
forfilese consente inoltre di specificare un percorso da cui iniziareforfiles /P C:\Windows ...


@DavidPostill sì, è stata una risposta scadente. Grazie per i tuoi commenti Per favore fatemi sapere se posso migliorare ulteriormente la mia risposta.
JJS,

@DavidPostill non hai risposte o commenti precedenti. stai moderando le domande o stai cercando una risposta e inciampare sulla mia risposta di scarsa qualità?
JJS,

La tua risposta è stata visualizzata nella coda di recensioni "Post di bassa qualità". Come so molto sui file batch, mi ci sono avvicinato.
David Post

@DavidPostill grazie per la tua recensione. Accolgo con favore la tua revisione delle modifiche apportate alla mia risposta.
JJS,

Molto meglio ... :)
DavidPostill

-1

Elenca tutti i file, bare, ricorsivamente, usando gli attributi (non la directory) (solo file)

dir / B / S / A: -D

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

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


La domanda dice che l'OP sta “cercando di ottenere solo i nomi di file (senza estensioni o percorsi di file). ... Ma quando [ho provato dir /b /s] a scansionare in modo ricorsivo, ho anche ottenuto percorsi di file prima dei nomi dei file, cosa che non voglio. "Quindi, stai dicendo all'OP di provare una banale variazione su ciò che hanno già provato, e la tua risposta dimostra che produce lo stesso risultato di quando l'OP lo ha provato (cioè, non quello che vogliono).
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.