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

È stato utile?

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*, ma   find.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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top