Obtenga nombres de archivos desnudos recursivamente en el símbolo del sistema

19

Me encontré con un pequeño inconveniente tratando de obtener solo los nombres de archivo (sin extensiones o rutas de archivos) de forma recursiva. Esto funcionó para mí en la carpeta raíz:

dir /b

Pero cuando agregué / s para escanear de forma recursiva, también obtuve rutas de archivo antes de los nombres de archivo que no quiero. ¿Hay alguna manera de obtener nombres de archivo desnudos de todas las subcarpetas en un directorio?

Estoy en Windows 7 x64, prefiero usar el símbolo del sistema regular, no PS o VBS

TMRW
fuente

Respuestas:

15

Use el siguiente comando:

dir /b /a /s
  • / b elimina la fecha y otros detalles de la salida
  • / a solo genera el nombre de archivo, no hay rutas
  • / s habilita un listado de directorio recursivo

Si necesita guardar la salida en un archivo, puede usar:

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

EDITAR En realidad, la solución anterior no alcanza los objetivos de la pregunta original. Una cosa que noté de la pregunta es que la publicación solicita una lista recursiva. de lo que carece la otra respuesta, así que creo que agregar "/ s" en la respuesta del otro contestador será suficiente

for /f %a in ('dir /b /s') do @echo %~na
Nik So
fuente
¿Podrías explicar esto? Para mí tiene poco sentido.
Simon Sheehan
44
Esto no funciona, / a no funciona así: es un filtro para el tipo de archivos que desea enumerar. No elimina la ruta del nombre de archivo cuando se hace una lista recursiva de directorios.
Gaff
editó la respuesta; y acabo de poner mis manos en una ventana de Windows nuevamente, creo que esta vez debería hacerlo (win732bit)
Nik So
6

Prueba esto:

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

Más información sobre cómo funciona y qué está haciendo, escriba for /?

Multiverse IT
fuente
Esto casi funciona pero hay un gran problema. Solo genera la primera palabra de un nombre de archivo. Si un nombre de archivo es, por ejemplo, "mi imagen de vacaciones 1", entonces solo genera "mi"
TMRW
intente esto: para / f "delims = |" % a in ('dir / b') do @echo% ~ na. Por defecto, el parámetro / f de FOR se tokenizará en espacios. Establecer el token en un carácter que no debería aparecer en los nombres de archivo / directorio le dará el nombre completo, incluidos los espacios.
Scott McKinney
Si desea que la salida se envíe a un archivo, agregue>> filename.txt
Gruber el
2
for /r %i in (*) do @echo %~ni

o

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

asumiendo un archivo noquotes.baten su % PATH% con este contenido

@echo %~1

enfoque for / r explicado

for /rrecorre el directorio actual de forma recursiva (puede especificar un directorio for /r drive:\path\, se asume el directorio actual) y ejecuta el comando especificado por do para cada archivo que coincida en el conjunto (*). El conjunto (.)solo coincidiría con los directorios. @echo% ~ ni Este comando funciona tal cual desde el indicador. Duplique sus presupuestos si lo coloca dentro de un archivo por lotes. es decirfor /r %%i in (*) do @echo %%~ni

enfoque explicado de los archivos

/senumera los subdirectorios actuales y todos
/cejecuta el comando dentro de las comillas
@isdiry @fnamees un símbolo emitido en la cadena de comandos
El archivo de lote adicional noquotes.batayuda al eliminar las comillas dobles con% ~ 1 (parámetro 1)
forfilestambién le permite especificar una ruta para comenzar enforfiles /P C:\Windows ...

JJS
fuente
@DavidPostill sí, fue una respuesta pobre. Gracias por tus comentarios. Avíseme si puedo mejorar aún más mi respuesta.
JJS
@DavidPostill no tienes respuesta o comentario previo. ¿Moderaba preguntas o buscaba una respuesta y tropezaba con mi respuesta de mala calidad?
JJS
Su respuesta apareció en la cola de revisión "Publicaciones de baja calidad". Como sé mucho sobre archivos por lotes, lo examiné.
DavidPostill
@DavidPostill gracias por tu comentario. Agradezco su revisión de los cambios que hice a mi respuesta.
JJS
Mucho mejor ... :)
DavidPostill
-1

Enumere todos los archivos, desnudos, recursivamente, utilizando atributos (no directorio) (solo archivos)

dir / B / S / A: -D

C: \ prueba \ caché> dir / B / S / A: -D

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

Brandon Hunt
fuente
La pregunta dice que el OP está "tratando de obtener solo los nombres de archivo (sin extensiones o rutas de archivo). ... Pero cuando [intenté dir /b /s] escanear de forma recursiva, también obtuve rutas de archivo antes de los nombres de archivo, lo que no quiero ". Entonces, le está diciendo al OP que intente una variación trivial de lo que ya han intentado, y su respuesta demuestra que produce el mismo resultado que cuando el OP lo intentó (es decir, no lo que quieren).
Scott