15 votos

¿El equivalente en Windows de ls * (asterisco) directorio wildcarding?

Otra pregunta de un viejo usuario de Unix/Linux que se encuentra en un mundo de Windows. Primero déjeme explicarle exactamente lo que estoy tratando de hacer. Estoy usando el cmd.exe de Windows Shell, y quiero listar todos los directorios debajo del directorio actual que contengan un bin \Debug jerarquía, y determinar si contienen algún archivo (por ejemplo: tratando de averiguar si mi objetivo NAnt limpio funciona correctamente). Mi jerarquía podría parecerse a algo como esto:

\Current
    \DirA
         \bin
             \Debug
                  (some files under debug)
             \Release
    \DirB
         \bin
             \Debug
    \DirC
         \bin
             \Release

En Unix, ls */bin/Debug me daría una lista de todas las cosas en DirA/bin/Debug y mostrarme el hecho de que DirB/bin/Debug está vacía. He intentado diferentes contorsiones en el cmd Shell, pero sigo dando vueltas con cosas como:

    > dir \*\\bin\\Debug
    The filename, directory name, or volume label syntax is incorrect.

    > dir \*\\\*\\\*
    The filename, directory name, or volume label syntax is incorrect.

¿Hay algo sutil que no entiendo sobre el mando dir, o sólo está limitado de esa manera?

Sí, me doy cuenta de que puedo cambiar al explorador, navegar, hacer clic con el botón derecho del ratón y, probablemente, crear una búsqueda que haga lo que quiero, pero estoy más interesado en la solución de la línea de comandos rápida y sucia.

13voto

james Puntos 286

Algo como esto debería hacer lo que quieres. En el directorio root del proyecto escriba:

c:\path\to\slndir>dir *.dll *.exe /s /b | findstr /i "bin\debug"

Argumentos Dir: /s - recursivo, /b - "desnudo", sin información extra
argumentos de findstr: /i - ignorar caso

En general, la "ayuda comando ' mostrará la ayuda de los comandos Shell. Si eso no funciona, entonces
' comando /?" generalmente mostrará la ayuda.

8voto

Joe Simpson Puntos 111

Windows no utiliza comodines como lo hace Linux. Sólo la parte del nombre del archivo puede contener comodines.

Puedes descargar una versión de ls que funcione en Windows y utilizarla. Yo he utilizado Cygwin pero estoy seguro de que hay otros.

3voto

Meinersbur Puntos 121
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

No es bonito, pero debería funcionar. También puede poner en un archivo .cmd (luego reemplazar cada % en doble %%). O definir una macro usando doskey (sí, todavía existe).

Asegúrese de que las extensiones cmd están activadas.

EDITAR: Cómo funciona:

El primer bucle for itera a través de todos los subdirectorios (interruptor /D y /r) de forma iterativa. %~fP se expande a la ruta completa de ese directorio. Luego, agrega \bin\Debug * a ese camino. El segundo bucle for enumera todos los archivos que coinciden. %~ftzaQ se expande a cada archivo que coincide y se imprime en la pantalla mediante echo. El extraño %~ftzaQ lo formatea como una salida dir. El carácter @ evita que los propios comandos se impriman en la pantalla.

Para más información, consulte

2voto

Tim Gilbert Puntos 121

unxutils tiene un comando ls. Sin embargo, el problema es realmente con el Shell de Windows. En unix su Shell se expandirá */bin/Debug en los nombres de las rutas relevantes y alimentarlas al comando ls como argumentos separados de la línea de comandos.

Cygwin ciertamente te serviría, o podrías probar con un puerto Windows de un unix Shell como bash . Si quieres ir por la ruta de los scripts, puedes codificar algo en Python muy fácilmente usando el módulo global y la mayoría de los demás lenguajes de programación tienen un equivalente.

2voto

aditya Puntos 111

Puedes hacer algo como "dir /s *.obj *lib". Dará un resumen al final de cuántos archivos coinciden.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: