En la década de 1990, usaría " *.*
" para representar cualquier nombre de archivo en MS-DOS, pero he visto más scripts usando solo " *
" estos días. ¿Realmente hace alguna diferencia cuál uso?
command-line
Foebane
fuente
fuente
*
y*.*
ahora son equivalentes acmd
los comandos internos y modernas utilidades de línea de comandos, algunas utilidades de más edad que tienen parámetros de máscara de archivo pueden utilizar las funciones de comparación de archivos de más edad, y para ellos las máscaras no serán equivalentes.*.*
token no debería devolver archivos sin extensión.*.*
no debería devolver archivos sin extensión. Lamentablemente lo hace. Ver la respuesta de Grawity.Respuestas:
El nombre y la extensión del archivo han sido un solo campo desde que Windows 95 y NT 3.5 introdujeron la compatibilidad con "nombre de archivo largo", y las coincidencias con comodines se realizan contra todo el nombre de archivo a la vez. Como resultado, puede tener un nombre de archivo sin puntos (tal vez raro para archivos, pero muy común para carpetas / directorios) y, a primera vista
*.*
, en realidad no coincidiría con dichos archivos.El uso de scripts antiguos
*.*
seguirá funcionando debido al código de compatibilidad: si el comodín termina con.*
, el sistema operativo ignora esa parte . (Por lo tanto, si desea hacer coincidir específicamente los archivos con una extensión, supongo que necesitaría*.?*
eso).Pero no es algo en lo que deba confiar; Si está escribiendo scripts para versiones modernas de Windows, siga sus convenciones, no las convenciones de MS-DOS. (Tenga en cuenta que a partir de Windows NT, los scripts .bat ya no son interpretados por MS-DOS sino por
cmd.exe
un programa Win32 nativo).En Linux y varios otros Unixen, el nombre y la extensión nunca se han separado en primer lugar, y no hay ninguna magia especial para hacer el
*.*
trabajo, por lo que*
es la única opción que tiene sentido.fuente
*
solo coincidiría con nombres de archivos sin una extensión. La forma "segura" de ser compatible con ambos era usar**
.*
( por defecto ) no coincide con los nombres de archivos ocultos (comenzando con a.
).Probablemente vale la pena mencionar que el unixy / conchas posixy como bourne shell, bash, ksh, zsh, etc. hacen expansión de comodines (de caracteres glob como
*
,?
,[range]
,[!range]
y otras expansiones como llaves y globos largos) para compilar una lista de argumentos antes de la orden es ejecutado. Entonces, esta expansión la realiza el shell, no el comando para el cual estos pueden ser argumentos.es decir, el shell es responsable de qué
*
, se*.*
expande aEste no es el caso en CMD (y de manera similar para las utilidades de PowerShell ) ya que pasa los caracteres glob textualmente al comando ejecutado, por lo que la expansión es responsabilidad del comando / utilidad y no del shell. Entonces, en última instancia, qué
*.*
o qué*
medios le queda a la utilidad dejándola conforme (o no) a las convenciones, razón por la cual las utilidades de CMDdir *.*
también coinciden (posiblemente incorrectamente pero conservando las expectativas) archivos sin extensiones.Creo que es seguro resumir de esta manera.
fuente
FindFirstFile
en sí mismo es en modo de usuario (tanto kernel32.dll como ntdll.dll son bibliotecas en modo de usuario; es parte del subsistema Win32, no el núcleo), pero en realidad no hace mucho.mmv "fred.*" "tom.#1"
. (El reemplazo usa en#1
lugar de*
, lo que tiene la ventaja de permitirle reordenar los campos).mmv
no está instalado de manera predeterminada en la mayoría de los sistemas, pero a menudo otras herramientas de cambio de nombre de lotes sí lo están. Vea este artículo al respecto y stackoverflow.com/questions/417916/how-to-do-a-mass-rename .