¿Equivalente de Windows del directorio ls * (asterisco)?

14

Otra pregunta de un usuario antiguo de Unix / Linux que se encuentra en un mundo de Windows. Primero déjame explicarte exactamente lo que estoy tratando de hacer. Estoy usando el shell cmd.exe de Windows, y quiero enumerar todos los directorios debajo del directorio actual que contiene una jerarquía bin \ Debug, y determinar si contienen algún archivo (por ejemplo: tratando de averiguar si mi objetivo de NAnt clean es trabajando apropiadamente). Mi jerarquía podría verse así:

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

En Unix, ls */bin/Debugsolo me daría una lista de todas las cosas DirA/bin/Debugy me mostraría el hecho de que DirB/bin/Debugestá vacío. He probado diferentes contorsiones en el shell de cmd, pero sigo terminando con cosas como:

    > dir * \ bin \ Debug
    El nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta de volumen es incorrecta.

    > dir * \ * \ *
    El nombre de archivo, el nombre del directorio o la sintaxis de la etiqueta de volumen es incorrecta.

¿Hay algo sutil que no entiendo sobre el comando dir, o simplemente está limitado de esa manera?

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

Salmo de ogro33
fuente
Si bien es bueno saber acerca de todas las herramientas similares a Unix que puedo agregar a Windows (¡y créanme que uso Cygwin en casa!), No siempre las tendré disponibles donde quiera que vaya (y de hecho podría no tener el derecho de administrador para instalarlos en cada PC que uso).
Ogre Psalm33

Respuestas:

13

Algo como esto debería hacer lo que quieras. En el directorio raíz del tipo de proyecto:


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

Argumentos de Dir: / s - recursivo, / b - "desnudo", no hay información adicional para
encontrar argumentos: / i - ignorar mayúsculas y minúsculas

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

James
fuente
¡Excelente! Me doy cuenta de que existen muchas herramientas / kits de herramientas para ayudarme a "linuxizar" mi Windows, pero estaba buscando la forma de Windows de hacer lo que estoy tratando de hacer, ¡y esto es exactamente!
Ogre Psalm33
7

Windows no hace comodines como lo hace Linux. Solo la parte del nombre de archivo puede contener comodines.

Puede descargar una versión de ls que se ejecuta en Windows y usarla. He usado Cygwin , pero estoy seguro de que hay otros.

Mark Ransom
fuente
También PowerShell
Joel Coehoorn
3
Otra cosa a tener en cuenta: en Windows, los comodines se expanden con el comando, no con el shell.
Laurence Gonsalves
2

unxutils tiene un comando ls. Sin embargo, el problema es realmente con el shell de Windows. En Unix, su shell se expandirá */bin/Debuga los nombres de ruta relevantes y los alimentará al comando ls como argumentos de línea de comandos separados.

Cygwin ciertamente haría el truco por ti, o podrías probar un puerto de Windows de un shell de Unix como bash . Si desea seguir la ruta de los scripts, puede codificar algo en python con bastante facilidad utilizando el módulo glob , y la mayoría de los otros lenguajes de scripts tienen un equivalente.

Tim Gilbert
fuente
2

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

Joel Lucsy
fuente
Cerca. Te di accesorios, pero la respuesta de James está más cerca, ya que filtra los archivos que no están en \ debug para mí.
Ogre Psalm33
2
@for /D /r %P in (.) do @for %Q in ("%~fP\bin\Debug\*") do @echo %~ftzaQ

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

Asegúrese de que las extensiones cmd estén habilitadas.

EDITAR: Cómo funciona:

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

Para más, ver

Meinersbur
fuente
Intenté esto y de hecho funciona. Pero siendo algo inexperto en el shell de cmd, todavía no lo entiendo todo :-).
Ogre Psalm33
0

En el mundo de Windows, cmd.exe no expande comodines: se pasan tal cual al programa en su línea de comando o matriz argv. Por lo tanto, cada programa los analiza y los expande de manera diferente, y algunos de los usos más avanzados (como los que está buscando) generalmente no son compatibles.

La sugerencia de timgilbert de usar Cygwin es buena, también el paquete GNUWin32 podría tener algo que lo ayude.

Michael Burr
fuente