Pregunta

Estoy usando binarios GnuWin32 en un entorno Windows.
Cuando quiero encontrar archivos de un tipo determinado, digamos PDF, que generalmente se ejecuta:

find . -iname '*.pdf' -print

Esto funciona perfectamente en cualquier sistema UNIX.

find.exe . -iname "*.pdf" -print

Sin embargo, en Windows, después de haber reemplazado las comillas simples con comillas dobles, sólo funciona cuando no hay ningún archivo PDF en el directorio actual, de lo contrario el * se expandió .

Peor:. Cuando hay exactamente un archivo PDF en el directorio actual, se expandirá, no habrá ningún error de sintaxis y obtendrá resultados erróneos

He tratado de escapar de la * con un acento circunflejo, una barra invertida, una estrella en sí, poniendo entre comillas dobles:. Nada funciona para mí

Ejemplo real:

De acuerdo, aquí están todos mis archivos:

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

El buen comportamiento, comodín no se amplió

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

Precaución, comportamiento incoherente, comodín se amplió:

C:\tmp\a>find . -iname "*.pdf"
find: paths must precede expression
Usage: find [-H] [-L] [-P] [path...] [expression]

C:tmp\a>cd ..\b

Precaución, comportamiento incoherente, comodín se amplió:

C:\tmp\b>find . -iname "*.pdf"
./1.pdf
./bb/1.pdf

Gracias

¿Fue útil?

Solución

Me he encontrado la solución a mi problema.

  • find.exe de GnuWin32 no está trabajando en las últimas versiones de Windows (Vista, Seven) porque expande los comodines de búsqueda sólo el contenido del directorio actual.
  • Del mismo modo, una versión antigua de find.exe de UnxUtils sufrió el mismo error.
  • La última find.exe de UnxUtils está trabajando.

Otros consejos

Una solución es agregar un comodín / expansión que el shell de Windows no se expande, pero hallazgo GNU hace:

find.exe . -name *[.:]pdf -print

El shell de Windows [*] no interpreta / expandir corchetes. Además, el colon no es un carácter válido en los nombres de archivos de Windows, por lo que este patrón de no pueden que coincida con cualquier nombre de archivo de Windows, y el shell de Windows siempre pasará el patrón a través de find.exe.

Find.exe continuación encontrará todos los archivos que terminan en .pdf o :pdf, pero ya que no hay archivos pueden tener un nombre que termina en :pdf bajo Windows, que sólo encontrará archivos que terminan en .pdf.

[*] En realidad es el tiempo de ejecución de C que hace / no realizar estas expansiones de comodines. No entiendo el Win32 C tiempo de ejecución lo suficientemente bien como para refinar la distinción, así que por ahora a los efectos de esta solución, sólo estoy diciendo 'concha'.

he sufrido este problema esta tarde. UnxUtils de Benoit pueden trabajar. También encuentro de trabajo pueden find.exe de MinGW, que está bajo mi

"MinGW \ MSYS \ 1.0 \ bin"

directorio. Y es consistente con el manual.

GnuWin32 y UnxUtils: find.exe . -name GameCli* trabajo, pero find.exe . -name 'GameCli*' no funciona.

trabajo find.exe . -name 'GameCli*' de MinGW.

No he encontrado nada mejor que sólo evitar caracteres comodín

find.exe . -iregex ".+\.pdf" -print

@OP, tengo un comportamiento coherente

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

Es posible que desee para tratar de usar findutils en lugar de UnxUtils.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top