Cómo hacer coincidir un sufijo de nombre de file

¿Cómo verificar si el nombre de un nombre de file .xml terminó con .any-string ? ej. .previous o .backup o bck12 etc …

Necesito imprimir el nombre del file XML a exception de los files XML que terminan con .any-string o tienen algo después de .xml

¿Cómo verificar esto con grep o awk o sed o perl o cualquier otra idea? Algo como

  file=machine_configuration.xml file=machine_configuration.xml.previos file=machine_configuration.xml.backup echo $file | ..... 

Ejemplos:

  1. machine_configuration.xml : yes
  2. machine_configuration.xml.OLD : no
  3. `machine_configuration.xml-HOLD: no
  4. machine_configuration.xml10 : no
  5. machine_configuration.xml@hold : no
  6. machine_configuration.xml_need_to_verifi_this : no

Use el anclaje final regex ( $ ), por ejemplo:

 echo "$file" | grep '\.xml$' 

Para encontrar todos los files que terminan en "xml", sugeriría usar el command find , por ejemplo:

 find . -name '*.xml' 

Recursivamente enumeraría todos los files xml del directory actual.

Si entiendo correctamente, quiere detectar si un nombre de file termina en .xml .

 case $file in *.xml) echo "$file";; esac 

Si desea hacer algo cuando el nombre del file no coincide:

 case $file in *.xml) echo "matched $file";; *) echo "skipping $file";; esac 

Si ya tiene el nombre de file en una variable, un buen enfoque sería ampliar el parámetro

 $ echo $file text.xmllsls $ echo ${file%.xml*}.xml text.xml 

Donde %.xml* es que la última ocurrencia de .xml y todo lo que está detrás se eliminará. Por lo tanto, también hice eco de un .xml de nuevo.

O, para tener la testing también

 $ file=test.xmlslsls $ file2=${file%.xml*}.xml $ if [ $file = $file2 ]; then echo $file; fi $ $ $ file="test.xml" $ file2=${file%.xml*}.xml $ if [ $file = $file2 ]; then echo $file; fi test.xml 

O, en una sola línea

 $ if [ $file = ${file%.xml*}.xml ]; then echo $file; fi 

la manera más fácil …

 echo file=machine_configuration.xml | cut -d '.' -f 1