ver tamaño sintaxis lista fecha ejemplo completa comandos comando carpetas basicos windows command-line batch-file cmd dir

windows - tamaño - sintaxis del comando dir



Comportamiento extraño del comando DIR de Windows (4)

Descubrí esto por accidente mientras buscaba un archivo con un número en el nombre. Cuando escribo:

dir * numero *

(donde el número representa cualquier número del 0 al 9 y sin espacios entre los asteriscos y el número)

en el símbolo del sistema de cmd.exe, devuelve varios archivos que no aparecen en ninguno para ajustarse a los criterios de búsqueda. Lo extraño es que, dependiendo del directorio, algunos números funcionarán y otros no. Un ejemplo es, en un directorio asociado con un sitio web, escribo lo siguiente:

dir *4*

y lo que se devuelve es:

Directory of C:/Ampps/www/includes/pages 04/30/2012 03:55 PM 153 inventory_list_retrieve.php 06/18/2012 11:17 AM 6,756 ix.html 06/19/2012 01:47 PM 257,501 jquery.1.7.1.js 3 File(s) 264,410 bytes 0 Dir(s) 362,280,906,752 bytes free

Eso simplemente no tiene ningún sentido para mí. ¿Cualquier pista?

La pregunta se plantea en stackOverflow porque el comando DIR a menudo se combina con FOR en programas por lotes. El extraño comportamiento de DIR parece hacer que los programas por lotes sean potencialmente poco confiables si usan el comando DIR.

Edición: (nota adicional). Aunque ha pasado mucho tiempo, descubrí otra peculiaridad con esto que casi me cuesta mucho trabajo. Quería eliminar todos los archivos .htm en un árbol de directorio particular. Justo antes de hacerlo me di cuenta de que *.htm coincide con los archivos .html . Además, *.man coincide con .manifest , y probablemente hay otros. Eliminar todos los archivos .html en ese directorio en particular hubiera sido molesto por decir lo menos.


Los comodines en el símbolo del sistema se comparan con el nombre largo del archivo y el nombre corto "8.3" si hay uno presente. Esto puede producir sorpresas.

Para ver los nombres cortos, use la opción /X para el comando DIR .

Tenga en cuenta que este comportamiento no es en modo alguno específico para el comando DIR , y puede llevar a otras sorpresas (a menudo desagradables) cuando un comodín coincide más de lo esperado en cualquier comando, como DEL .

A diferencia de los shells * nix, la sustitución de un patrón de archivo con la lista de nombres coincidentes se implementa dentro de cada comando y no se implementa por el propio shell. Esto puede significar que diferentes comandos podrían implementar diferentes reglas de patrón de comodines, pero en la práctica esto es bastante raro, ya que Windows proporciona llamadas a la API para buscar archivos que coincidan con un patrón y la mayoría de los programas usan esas llamadas de manera obvia. Para los programas escritos en C o C ++ que utilizan las herramientas "habituales", la biblioteca de tiempo de ejecución de C proporciona esa expansión "de forma gratuita", utilizando la API de Windows.

La API de Windows en cuestión es FindFirstFile() y sus parientes cercanos FindFirstFileEx() , FindNextFile() y FindClose() .

Curiosamente, aunque la documentación de FindFirstFile() describe su parámetro lpFileName como "directorio o ruta, y el nombre del archivo, que puede incluir caracteres comodín, por ejemplo, un asterisco ( * ) o un signo de interrogación ( ? )" En realidad nunca define que el * y ? los caracteres significan

El significado exacto del patrón de archivo tiene una historia en el sistema operativo CP/M que data de principios de la década de 1970 que tuvo una gran influencia (algunos podrían decir que "se copió directamente" en lugar de "influencia" aquí) el diseño de MSDOS. Esto ha dado lugar a una serie de artefactos y comportamientos "interesantes". Algo de esto al final del espectro de DOS se describe en esta publicación del blog de 2007, donde Raymond describe exactamente cómo se implementaron los patrones de archivo en DOS.


Parece que el comando dir también busca nombres de archivo cortos (forma 8.3) bajo el capó.

Cuando llamo a dir *1* esto es lo que obtengo:

Volume in drive C is System Volume Serial Number is F061-0B78 Directory of C:/Users/Piotrek/Desktop/Downloads 2012-05-20 17:33 23 639 040 gDEBugger-5_8.msi 2012-05-20 17:30 761 942 glew-1.7.0.zip 2012-05-20 17:11 9 330 176 irfanview_plugins_433_setup.exe 2012-05-24 20:17 4 419 192 SumatraPDF-2.1.1-install.exe 2012-05-15 22:55 3 466 248 TrueCrypt Setup 7.1a.exe 5 File(s) 1 127 302 494 bytes

Hay un archivo gDEBugger-5_8.msi entre los listados, que aparentemente no tiene ningún carácter.

Todo se vuelve claro cuando uso el /X con el comando dir, que hace que dir use nombres de archivo 8.3. Salida de un comando dir /X *1* :

Volume in drive C is System Volume Serial Number is F061-0B78 Directory of C:/Users/Piotrek/Desktop/Downloads 2012-05-20 17:33 23 639 040 GDEBUG~1.MSI gDEBugger-5_8.msi 2012-05-20 17:30 761 942 GLEW-1~1.ZIP glew-1.7.0.zip 2012-05-20 17:11 9 330 176 IRFANV~1.EXE irfanview_plugins_433_setup.exe 2012-05-24 20:17 4 419 192 SUMATR~1.EXE SumatraPDF-2.1.1-install.exe 2012-05-15 22:55 3 466 248 TRUECR~1.EXE TrueCrypt Setup 7.1a.exe 5 File(s) 1 127 302 494 bytes

Cita de la ayuda de dir:

/X This displays the short names generated for non-8dot3 file names. The format is that of /N with the short name inserted before the long name. If no short name is present, blanks are displayed in its place.


Sí. Verás que también busca nombres cortos si intentas esto:

dir /x *4*

(/ x interruptor es para nombres cortos)

para filtrar nombres de archivos use:

dir /b | find "4"


Una cita de la respuesta de RBerteig:

Tenga en cuenta que este comportamiento no es en modo alguno específico para el comando DIR, y puede llevar a otras sorpresas (a menudo desagradables) cuando un comodín coincide más de lo esperado en cualquier comando, como DEL.

Lo anterior es cierto incluso para el comando FOR, que es muy desagradable.

for %A in (*4*) do @echo %A contains a 4

También buscará los nombres cortos. La solución nuevamente sería usar FIND o FINDSTR para filtrar los nombres de una manera más confiable.

for %A in (*) do @echo %A | >nul findstr 4 && echo %A contains a 4

Nota: cambie% A a %% A si usa el comando dentro de un archivo por lotes.

La combinación de FOR con FINDSTR puede ser un método de propósito general para usar de forma segura cualquier comando que tenga problemas con nombres de archivos cortos. Simplemente reemplace ECHO con el comando de problema como COPY o DEL.