Estoy tratando de generar un archivo de texto que contenga el nombre del archivo (incluida la ruta completa) y el tamaño del archivo para todos los archivos en un directorio particular y cualquiera de sus subdirectorios (es decir, recursivamente). Idealmente, no quiero comas en el tamaño del archivo (¡pero me conformaré con ellas!)
El siguiente comando lo hace pero sin el tamaño del archivo:
dir /b /s /a:-D > results.txt
Un resultado de ejemplo se vería así:
C:\Users\Martin\Pictures\Table\original\PC120013.JPG 227298
C:\Users\Martin\Pictures\Table\original\PC120014.JPG 123234
C:\Users\Martin\Pictures\Table\original\PC120015.JPG 932344
No creo que esto sea posible usando dir
solo, aunque me encantaría que me demuestren lo contrario. ¿Hay alguna otra manera de hacer esto, usando solo los comandos que están disponibles desde el Símbolo del sistema?
fuente
"tokens=*"
mensaje de la siguiente manera@echo off & for /f "tokens=*" %a in ('dir /s /b') do echo %~fa %~za
txt
archivo?for /r %a in (*) do echo %~fa %~za
>> C:\Temp\VideoList.txt
: los resultados de cualquier proceso anterior se escriben en un archivo de texto llamado VideoList . El uso de one > sobrescribirá el archivo ( si ya existe ) y el uso de >> agregará nuevos resultados al final si el archivo de texto ( si ya existe ). Si el archivo de texto aún no existe, este comando escribe un nuevo archivo con el nombre especificado.@echo off & for /f "tokens=*" %a in ('dir *.dwg /s /b') do echo %~fa >>dwgfiles.txt
Alternativa n. ° 1: FOR / R es más intuitiva que la n. ° 2 para mí.
Alternativa # 2: FOR / F corrige el problema con "espacios en los nombres" en la sugerencia de BrianAdkins.
Alternativa # 3: FORFILES sería mi elección, excepto que la ruta está entre comillas dobles.
Brian u otros gurús pueden tener una solución más elegante o pueden sugerir una docena de otras soluciones, pero estas tres funcionan. Intenté usar FOR TOKENS pero luego tuve que quitar los encabezados y pies de página, así que volví al número 1. También consideré crear un pequeño archivo .bat y llamarlo, pero eso agrega otro archivo (aunque proporciona mayor flexibilidad, como lo haría una función).
Probé todas las alternativas con directorios y nombres de archivos con espacios incrustados, un nombre de archivo de más de 200 caracteres, un nombre de archivo sin extensión y en la raíz de una unidad pequeña (solo por tiempo; un poco lento, como sugirió Brian), pero entonces está buscando en el Explorador de Windows; es por eso que instalé la aplicación de búsqueda Everything).
Alternativa # 1: FOR / R
Mejor (?) Mientras intentaba descubrir por qué la solución de Brian no funcionó para mí, miré HELP FOR y decidí probar el enfoque / R. (Crear un archivo sería lo mismo que en la Alternativa # 2).
Ejemplo: funciona (directorio diferente al anterior para demostrar la recursividad)
Alternativa # 2: FOR / F
BrianAdkins sugirió:
@echo off & for /f %a in ('dir /s /b') do echo %~fa %~za
Una respuesta corregida es:
Una respuesta más completa con directorios suprimidos y salida (adjunta) a un archivo es:
Nota: "delims = *" especifica un carácter no permitido en los nombres de archivo.
Nota: el segundo comando también suprime los directorios a través de / a: -d.
Nota: El nombre de la variable FOR está en mayúscula para aclarar la distinción entre los parámetros variables y variables si alguien elige diferentes nombres de variables.
Nota: Se agregó al archivo solo para sonrisas ya que el OP solicitó la salida a un archivo.
Supongo que realmente debería verificar el estado de ECHO y restablecerlo también.
Problema: espacios en los nombres
La solución propuesta de Brian no maneja los nombres de archivos y carpetas que contienen espacios (al menos no en mi configuración de Vista).
Ejemplo: incorrecto (sin delimitaciones; incluye suprimir directorio por OP pero con tamaño antes y después del nombre de archivo para enfatizar)
Nombre y tamaño truncados (4 de 6 archivos incorrectos):
Ejemplo: correcto (Nota de salida a la pantalla, no adjunta al archivo)
Alternativa # 3: FORFILES (Problema de cotización)
Esta solución es directamente de los últimos dos ejemplos en la documentación FORFILES (
forfiles /?
).La combinación de estos ejemplos y escribir en un archivo produce la respuesta (casi):
Tenga en cuenta que la ruta está entre comillas en la salida.
No importa si está activado
echo on
o noecho off
.Agregar una línea en blanco que separa cada directorio sería una extensión trivial del IF.
Precaución : ¡Usar la máscara
/m *.*
no devolverá archivos sin extensión (como el último archivo en el ejemplo)!Aparte : esto escribe un archivo en cada directorio con contenido de ese directorio:
forfiles /s /c "cmd /c if @isdir==FALSE echo @path @fsize >>ForfilesSubOut.txt"
no es lo que el OP quería pero a veces es útil.Ejemplo: funciona (pero con la ruta completa entre comillas)
Este ejemplo incluye un directorio adicional con un nombre de archivo súper largo y un nombre de archivo sin extensión.
Problema: Ruta entre comillas
Entonces, ¿hay una manera fácil de eliminar las comillas no deseadas (?) Según el ejemplo de OP y guardar la Alternativa # 3: FORFILES. (Pregunta retórica: ¿Son las citas una característica o un defecto?)
fuente
Me doy cuenta de que esto requiere una utilidad adicional , pero puede lograrlo de manera bastante sucinta utilizando la utilidad sfk :
( Obtuve el enfoque usando el comando sfk encadenando aquí )
fuente
Esto puede ser una trampa en la pregunta de los OP. Sin embargo, la pregunta ya no es relevante en los sistemas modernos basados en Windows. El alias Dir se usó para ayudar a dibujar el enlace lógico.
fuente
powershell "Get-ChildItem -Recurse| select name,length"
A continuación se muestra lo que solía localizar archivos de video misceláneos que ocupaban demasiado espacio en una unidad de red y escribir los resultados en un archivo de texto en una PC local.
Estoy publicando mi propia respuesta algo tardía por tres razones. Uno, me gustan las respuestas concisas. Dos, esta única línea de script funcionó en múltiples configuraciones para mí, incluso a través de una red. Tres, según el comentario potencialmente oscuro de Don Vince bajo la respuesta de Brian Adkins, el uso de tokens puede evitar problemas de los nombres de archivos con espacios en ellos.
for /f "tokens=*" %%a in ('dir H:\*.mov H:\*.avi H:\*.wmv H:\*.mp4 /s /b') do echo %%~fa %%~za >> C:\Temp\VideoList.txt
Noté que las rutas de archivo / nombres de archivo muy largos (cientos de caracteres) también pueden causar errores, pero la búsqueda no se bloqueará. Sin embargo, el camino no está completamente explorado para su (s) objetivo (s). Una vez señalado, puede compensar comenzando más profundamente en la estructura de carpetas para eliminar este error.
Esta página ss64 tiene una muy buena presentación del uso del comando dir , enumera todos los modificadores, muchas combinaciones de conmutadores y muestra varios ejemplos útiles de sintaxis adecuada. No es tan completo como las diversas comunidades de Stack Exchange, pero hay una clara claridad en la presentación una vez que se sienta cómodo con la línea de comandos / secuencias de comandos por lotes.
fuente
He llegado a esto con el siguiente comando:
El resultado:
PD: Esto se basa en la respuesta de BillR (Alternativa # 1). Sin embargo, en mi caso se cuelga con
@echo off
.fuente
El comando "du" me parece bastante útil y funciona tanto en Windows como en Unix (lo usé para verificar si todos los archivos se copiaron al transferir muchos datos de una PC con Windows a un servidor web Linux):
salidas:
Sin embargo, solo pude ver correctamente los caracteres especiales en el Bloc de notas, no en el Bloc de notas ++ (debe ser algo de codificación ANSI / UTF-8, no hay tiempo para analizar exactamente en este momento). Además, no encontré una solución para mostrar el tamaño después del nombre del archivo. Use las opciones "b" o "k" en lugar de "h" para mostrar el tamaño en bytes o kilobytes. Tuve algunos problemas al ejecutar el comando fuera de la carpeta que quiero analizar. Así que mejor ingrese el comando en el directorio correcto ("C: \ your_dir" en este ejemplo) y especifíquelo en el comando.
fuente
Omita la b en dir / b / s / a: -D> results.txt y los resultados deberían verse así (es decir, dir / s / a: -D> results.txt):
fuente
Sin complicarse demasiado, esto debería producir el resultado deseado. Dará un poco más de lo que solicitó el OP, pero pensé que valía la pena mencionarlo. Agregue el modificador / R para especificar un directorio que no sea el actual.
fuente
ERROR: Invalid syntax. Value expected for '/r'
así que considere volver al tablero de dibujo y proporcionar la sintaxis correcta y edite su respuesta con el detalle correcto.where /?
dice: “Por defecto, la búsqueda se realiza a lo largo del directorio actual y en las rutas especificadas por la variable de entorno PATH . "- por lo que suwhere * /t
comando enumera todos los archivosC:\Windows\System32
, algunos subdirectoriosC:\Program Files
y todos los demás directorios enPATH
. Para mí, eso fue más de 3000 líneas. Considere editar su respuesta para que sea razonable. PD Sin/R
, no es recursivo.