2012-06-19 12 views
15

Descubrí esto por accidente mientras buscaba un archivo con un número en el nombre. Cuando escribo:Comportamiento extraño de Windows DIR command

dir*número*

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

en el cmd.exe símbolo del sistema, devuelve varios archivos que no aparecen en ninguno para ajustarse a los criterios de búsqueda. Lo que es extraño, es que dependiendo del directorio, algunos números funcionarán y no otros. Un ejemplo es, en un directorio asociado con un sitio web, que escriba 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 comportamiento extraño de DIR parecería hacer que los programas por lotes sean poco confiables si usan el comando DIR.

Editar: (nota adicional). Aunque ha pasado mucho tiempo, descubrí otro capricho con esto que casi me cuesta mucho trabajo. Quería eliminar todos los archivos .htm en un árbol de directorios en particular. Me di cuenta justo antes de hacerlo que *.htm coincide con los archivos .html también. Además, *.man coincide con , y probablemente haya otros. Eliminar todos los archivos .html en ese directorio particular habría sido molesto, por decir lo menos.

+1

¡Interesante! Necesitamos hacer una prueba sobre este asunto ... – Aacini

+0

Guau, después de todos estos años, todavía sorprendido por esta tecnología. Puedo confirmar ese comportamiento extraño. – Helbreder

+0

http://superuser.com/questions/336358/is-it-a-good-idea-to-disable-short-filenames-on-windows-7-running-on-a-ssd-drive –

Respuesta

14

tarjetas salvajes en el símbolo del sistema se comparan con tanto el nombre de archivo largo y el corto "8.3" nombre si uno está presente . Esto puede producir sorpresas.

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

Tenga en cuenta que este comportamiento no es de ninguna manera específica al comando DIR, y puede conducir a otro (a menudo desagradable) sorprende cuando un comodín coincide con más de lo esperado en cualquier comando, como DEL.

A diferencia de * nix shells, la sustitución de un patrón de archivo con la lista de nombres coincidentes se implementa dentro de cada comando y no implementada por el propio shell. Esto puede significar que diferentes comandos podrían implementar diferentes reglas de patrón de comodín, pero en la práctica esto es bastante raro ya que Windows proporciona llamadas API para buscar archivos que coincidan con un patrón y la mayoría de los programas usan esas llamadas de la manera obvia. Para los programas escritos en C o C++ utilizando las herramientas "habituales", la biblioteca C runtime proporciona esa expansión "gratis", 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 para FindFirstFile() describe su parámetro lpFileName como "directorio o ruta de acceso y el nombre del archivo, que puede incluir caracteres comodín, por ejemplo, un asterisco (*) o un signo de interrogación (?)" nunca en realidad define lo que significan los caracteres * y ?.

El significado exacto del patrón de archivo tiene historial en el sistema operativo CP/M que data de principios de 1970 que influyó fuertemente (algunos podrían decir que "se copió directamente" en lugar de "influenciado" aquí) el diseño de MSDOS. Esto ha resultado en una serie de artefactos y comportamientos "interesantes". Algo de esto en el extremo DOS del espectro se describe en this blog post de 2007, donde Raymond describe exactamente cómo se implementaron los patrones de archivos en DOS.

11

Sí. Verá que también busca a través de nombres cortos si se intenta esto:

dir /x *4* 

(/ x interruptor es para nombres cortos)

para nombres de archivo de filtrado de usar:

dir /b | find "4" 
+1

si desea una búsqueda ÚNICAMENTE en el uso de nombres largos | find – npocmaka

+1

+1, Sí, los nombres de archivos cortos "ocultos" pueden causar problemas que no son obvios. La sugerencia de usar FIND debería funcionar: 'dir/b | encuentra "4" '. El uso de FINDSTR en su lugar permitiría un filtrado más selectivo a través de expresiones regulares. – dbenham

3

Parece al igual que el comando dir, también busca nombres de archivos cortos (8.3 formas) bajo el capó.

Cuando llamo dir *1* esto es lo que me pasa:

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 que figuran los que, al parecer, no tiene un carácter 1 en ella.

Todo se vuelve claro cuando uso el modificador /X con el comando dir, que hace que dir use los nombres de los archivos 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 

Presupuesto 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. 
4

Una cita de la respuesta de RBerteig:

Tenga en cuenta que este comportamiento no es de ninguna manera específica al comando DIR, y puede conducir a otro (a menudo desagradable) sorprende cuando un comodín partidos más de 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 -% de cambio de A a %% A si utiliza el comando en un archivo por lotes.

La combinación de FOR con FINDSTR puede ser un método de uso 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.