GnuWin32 Find.exe espande jolly prima di effettuare ricerca
Domanda
Sto usando binari GnuWin32 in un ambiente Windows.
Quando voglio trovare i file di un certo tipo, diciamo PDF, io di solito eseguire:
find . -iname '*.pdf' -print
Questo funziona perfettamente su qualsiasi sistema UNIX.
find.exe . -iname "*.pdf" -print
Ma sotto Windows, dopo aver sostituito le virgolette singole con doppie virgolette, funziona solo quando non c'è alcun file pdf nella directory corrente, altrimenti la *
viene ampliato .
Peggio:. Quando c'è esattamente un file PDF nella directory corrente, si espanderà, non ci sarà alcun errore di sintassi e si ottengono risultati sbagliati
Ho provato sfuggire alla *
con un accento circonflesso, una barra rovesciata, una stella stessa, mettendo tra virgolette doppie:. Niente funziona per me
esempio reale:
D'accordo, ecco tutti i miei file:
C:\tmp>find . -type f
./a/1.pdf
./a/2.pdf
./a/aa/1.pdf
./b/1.pdf
./b/bb/1.pdf
./b/bb/2.pdf
Buon comportamento, jolly non è stato ampliato
C:\tmp>find . -iname "*.pdf"
./a/1.pdf
./a/2.pdf
./a/aa/1.pdf
./b/1.pdf
./b/bb/1.pdf
./b/bb/2.pdf
C:\tmp>cd a
Attenzione, comportamento incoerente, jolly è stato ampliato:
C:\tmp\a>find . -iname "*.pdf"
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]
C:tmp\a>cd ..\b
Attenzione, comportamento incoerente, jolly è stato ampliato:
C:\tmp\b>find . -iname "*.pdf"
./1.pdf
./bb/1.pdf
Grazie
Soluzione
mi sono trovato la soluzione al mio problema.
-
find.exe
di GnuWin32 non sta lavorando su versioni più recenti di Windows (Vista, Seven) perché si espande i caratteri jolly corrispondenti solo il contenuto della directory corrente. - Allo stesso modo, una vecchia versione di Find.exe dal UnxUtils ha sofferto lo stesso problema.
- L'ultima
find.exe
da UnxUtils sta lavorando.
Altri suggerimenti
Una soluzione è quella di aggiungere un jolly / espansione che la shell di Windows non si espande, ma GNU find fa:
find.exe . -name *[.:]pdf -print
La shell di Windows [*] non interpreta / espandere parentesi quadre. Inoltre, i due punti non è un carattere valido nei nomi dei file di Windows, quindi questo modello non può adattarsi a qualsiasi nome di file di Windows, e la shell di Windows sarà sempre passare il modello fino alla Find.exe.
Find.exe sarà poi trovare tutti i file che terminano in .pdf
o :pdf
, ma dal momento che nessun file possono avere un nome che termina con :pdf
sotto Windows, troverà solo i file che terminano in .pdf
.
[*] In realtà è il runtime C che fa / non eseguire queste espansioni jolly. Non capisco Win32 C runtime abbastanza bene per raffinare la distinzione, quindi per ora per lo scopo di questa soluzione alternativa, sto solo dicendo 'shell'.
ho sofferto questo problema questo pomeriggio. UnxUtils di Benoit possono lavorare. Trovo anche il lavoro può Find.exe di MinGW, è sotto la mia
"MinGW \ msys \ 1.0 \ bin"
directory. Ed è coerente con il manuale.
GnuWin32 e UnxUtils: lavoro
find.exe . -name GameCli*
, mafind.exe . -name 'GameCli*'
non funziona.lavoro
find.exe . -name 'GameCli*'
di MinGW.
Non ho trovato nulla di meglio di un semplice evitando i caratteri jolly
find.exe . -iregex ".+\.pdf" -print
@OP, ho un comportamento coerente
C:\test\temp>find . -iname "*.txt"
./1.txt
./2.txt
C:\test\temp>cd a
C:\test\temp\a>find . -iname "*.txt"
C:\test\temp\a>cd ..\b
C:\test\temp\b>find . -iname "*.txt"
C:\test\temp\b>find --version
GNU find version 4.2.20
Features enabled: CACHE_IDS D_TYPE
Si consiglia di provare a utilizzare findutils invece di UnxUtils.