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/Debug
solo me daría una lista de todas las cosas DirA/bin/Debug
y me mostraría el hecho de que DirB/bin/Debug
está 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.
fuente
Respuestas:
Algo como esto debería hacer lo que quieras. En el directorio raíz del tipo de proyecto:
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.
fuente
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.
fuente
unxutils tiene un comando ls. Sin embargo, el problema es realmente con el shell de Windows. En Unix, su shell se expandirá
*/bin/Debug
a 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.
fuente
Puede hacer algo como "dir / s * .obj * lib". Dará un resumen al final de cuántos archivos coinciden.
fuente
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
fuente
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.
fuente