GnuWin32 find.exe expande comodín antes de realizar la búsqueda
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
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, perofind.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.