Equivalente di Windows del jolly della directory ls * (asterisco)?


14

Un'altra domanda di un utente Unix / Linux di lunga data che si ritrova in un mondo Windows. Prima di tutto lasciami spiegare esattamente cosa sto cercando di fare. Sto usando la shell cmd.exe di Windows e voglio elencare tutte le directory sotto la directory corrente che contengono una gerarchia bin \ Debug e determinare se contengono file (ad esempio: provare a capire se il mio obiettivo pulito NAnt è funziona correttamente). La mia gerarchia potrebbe assomigliare a questa:

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

In Unix, ls */bin/Debugmi darebbe solo un elenco di tutte le cose in DirA/bin/Debug, e mi mostrerebbe il fatto che DirB/bin/Debugè vuoto. Ho provato diverse contorsioni nella shell cmd, ma continuo a finire con cose come:

    > dir * \ bin \ Debug
    La sintassi del nome file, della directory o dell'etichetta del volume non è corretta.

    > dir * \ * \ *
    La sintassi del nome file, della directory o dell'etichetta del volume non è corretta.

C'è qualcosa di sottile che non capisco riguardo al comando dir, o è solo limitato in quel modo?

Sì, mi rendo conto di poter semplicemente passare a explorer, navigare, fare clic con il tasto destro e probabilmente creare una ricerca che fa quello che voglio, ma sono più interessato alla soluzione da riga di comando quick-n-dirty.


Anche se è bello conoscere tutti gli strumenti unix che posso aggiungere a Windows (e credetemi che uso Cygwin a casa!), Non li avrò sempre disponibili ovunque io vada (e in effetti potrebbe non avere l'amministratore giusto per installali su ogni PC che utilizzo).
Ogre Salmo33

Risposte:


13

Qualcosa del genere dovrebbe fare quello che vuoi. Nella directory principale del tipo di progetto:


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

Argomenti Dir: / s - ricorsivo, / b - "bare", nessuna informazione
aggiuntiva argomenti findstr: / i - ignora case

In generale, "help command " mostrerà aiuto per i comandi della shell. Se non funziona, allora
' comando /?' mostrerà generalmente aiuto.


Eccellente! Mi rendo conto che ci sono molti strumenti / toolkit là fuori per aiutarmi a "linuxizzare" il mio Windows, ma stavo cercando il modo di Windows di fare quello che sto cercando di fare, e questo è esattamente!
Ogre Salmo33

7

Windows non esegue i caratteri jolly come Linux. Solo la parte del nome file può contenere caratteri jolly.

Puoi scaricare una versione di ls che gira su Windows e usarla. Ho usato Cygwin , ma sono sicuro che ce ne sono altri.


Anche PowerShell
Joel Coehoorn,

3
Un'altra cosa da tenere a mente: in Windows i caratteri jolly sono espansi dal comando, non dalla shell.
Laurence Gonsalves,

2

unxutils ha un comando ls. Il problema è davvero con la shell di Windows, tuttavia. Su unix la shell si espanderà */bin/Debugnei relativi percorsi e li invierà al comando ls come argomenti della riga di comando separati.

Cygwin farebbe sicuramente il trucco per te, oppure potresti provare una porta windows di una shell unix come bash . Se volessi seguire la strada degli script, potresti codificare qualcosa in Python abbastanza facilmente usando il modulo glob , e la maggior parte degli altri linguaggi di script ha un equivalente.


2

Puoi fare qualcosa come "dir / s * .obj * lib". Fornirà un riepilogo alla fine del numero di file corrispondenti.


Vicino. Ti ho dato degli oggetti di scena, ma la risposta di James è più vicina, poiché filtra i file non in \ debug per me.
Ogre Salmo33

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

Non carino, ma dovrebbe funzionare. Puoi anche inserire un file .cmd (quindi sostituire ogni singolo% in doppio %%). Oppure definisci una macro usando doskey (sì, esiste ancora).

Assicurarsi che le estensioni cmd siano abilitate.

EDIT: come funziona:

Il primo per il ciclo scorre attraverso tutte le sottodirectory (switch / D e / r) in modo iterativo. % ~ fP si espande nel percorso completo di quella directory. Quindi aggiunge \ bin \ Debug * a quel percorso. Il secondo per il ciclo enumera tutti i file corrispondenti. % ~ ftzaQ viene espanso ad ogni corrispondenza dei file e stampato sullo schermo tramite eco. Lo strano% ~ ftzaQ lo formatta come un output dir. Il carattere @ evita che i comandi stessi vengano stampati sullo schermo.

Per di più, vedi


Ho provato questo e in effetti funziona. Ma essendo un po 'inesperto nella shell cmd, non riesco ancora a capire tutto :-).
Ogre Salmo33

0

Nel mondo Windows cmd.exe non espande i caratteri jolly, ma vengono passati così come sono al programma nella riga di comando o nell'array argv. Pertanto ogni programma analizza e li espande in modo diverso e alcuni degli usi più avanzati (come quello che stai cercando) non sono generalmente supportati.

Il suggerimento di timgilbert di usare Cygwin è buono, anche il pacchetto GNUWin32 potrebbe avere qualcosa che ti aiuterà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.