bash extended glob - coincide con archivos sin prefijo

13

Estoy tratando de hacer coincidir los nombres de archivo para una cárcel de fail2ban, por lo que necesito usar solo la globalización de nombres de archivo, no expresiones regulares o secuencias de comandos bash.

Mi /var/log/apache2directorio contiene archivos que incluyen:

example.com.error.log
db.example.com.error.log
app1.example.com.error.log
app2.example.com.error.log

Estoy tratando de crear un globo para que coincida con todos los archivos que terminan en .error.log excepto db.example.error.log , ¿es esto posible?

Lo he intentado !(db)*.error.logpero esto todavía coincide db.example.com.error.log. Supongo que !()no coincide con ningún carácter, lo que permite *que coincida desde el comienzo del nombre del archivo.

Nota: No quiero tener que extender el glob cuando appXse agregan nuevos archivos de registro, por lo que no puedo usar @()con la lista de nombres de archivos no db conocidos actualmente.

(Antecedentes: quiero crear un filtro que prohíba a cualquiera que solicite URL de phpMyAdmin en cualquier dominio, excepto db.example.com)

artista de fuego
fuente

Respuestas:

18

El patrón de globalización de nombre de archivo extendido (compatible bashcon la extglobopción de shell activada y también por ksh93)

!(db*).error.log

ignorará todo lo que comience con db.

Para ser más especifico:

!(db.example.com).error.log

Esto ignorará cualquier nombre en el directorio actual que comience exactamente db.example.com.

El !(db.example.com)patrón actúa como un "especial *" que no coincidirá con la cadena db.example.com.


Tu patrón

!(db)*.error.log

excluye cualquier nombre que comience con db, pero permite cualquier cadena después de eso, lo que obviamente incluye db.

Por la misma analogía que arriba, !(db)actúa "como *" pero no coincide con la cadena exacta db, dejándonos con el patrón, **.error.log por así decirlo (siendo el primero *"especial").

Kusalananda
fuente