Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

479
Views
¿Hay alguna manera de escribir un patrón global que coincida con todos los archivos, excepto los de una carpeta?

Necesito escribir un archivo glob que coincida con todos los archivos, excepto los que se encuentran dentro de una determinada carpeta (por ejemplo, todos los archivos, excepto los que se encuentran dentro de la carpeta de alto nivel foo/ .

He llegado al siguiente globo:

 !(foo)/**/*

Sin embargo, este glob no parece coincidir con ningún archivo en Ruby's File.fnmatch (incluso con FNM_PATHNAME y FNM_DOTMATCH configurados en true .

Además, el intérprete global de Ruby parecía tener un comportamiento diferente al de JavaScript:

El intérprete global de JavaScript coincide con todas las cadenas

El intérprete de Ruby glob no coincide con ninguna cadena:

 2.6.2 :027 > File.fnmatch("!(foo)/**/*", "hello/world.js") => false 2.6.2 :028 > File.fnmatch("!(foo)/**/*", "test/some/globs") => false 2.6.2 :029 > File.fnmatch("!(foo)/**/*", "foo/bar/something.txt") => false
over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Si realmente necesita usar un glob, puede enumerar lo que está permitido, haciéndolo equivalente a la negación:

 extglob = "{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*}/**/*" File.fnmatch(extglob, "hello/world.js", File::FNM_EXTGLOB | File::FNM_PATHNAME) #=> true File.fnmatch(extglob, "test/some/globs", File::FNM_EXTGLOB | File::FNM_PATHNAME) #=> true File.fnmatch(extglob, "foo/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME) #=> false File.fnmatch(extglob, "food/bar/something.txt", File::FNM_EXTGLOB | File::FNM_PATHNAME) #=> true

{[^f]*,f,f[^o]*,fo,fo[^o]*,foo?*} significa:

  • Cualquier cadena que no comience con f
  • La cuerda f
  • Cualquier cadena que comience con f y cuyo segundo carácter no sea una o
  • La fo
  • Cualquier cadena que comience con fo y cuyo tercer carácter no sea una o
  • Cualquier cadena que comience con foo si tiene al menos un carácter más

Actualizar

Si su literal de cadena es demasiado largo, podría convertirse en un dolor generar un globo que lo niegue, entonces, ¿por qué no hacer una función para él?

 def extglob_neg str str.each_char.with_index.with_object([]) do |(_,i),arr| arr << "#{str[0,i]}[^#{str[i]}]*" arr << str[0..i] end.join(',').prepend('{').concat('?*}') end extglob_neg "Food" #=> "{[^F]*,F,F[^o]*,Fo,Fo[^o]*,Foo,Foo[^d]*,Food?*}"

nota: no implementé ningún escape global en esta función porque parecía un poco complicado. Yo podría, sin embargo, estar equivocado

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!