
Tengo una lista de archivos dentro de un directorio y quiero crear un script bash que use una expresión regular para verificar si cada nombre de archivo dentro tiene esta sintaxis:
xxxx_xxxx_xx_xx
Donde x son números.
Editar: solo necesito con la expresión regular
Respuesta1
Qué tal si
#/usr/bin/env bash
for f in *
do
[[ $f =~ [0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2} ]] ||
echo "File $f does not match"
done
La expresión regular busca cualquier dígito ( [0-9]
). Los números entre llaves son el número de repeticiones, por lo que [0-9]{4}
coincidirán con 4 dígitos cualesquiera.
Te recomendaría que no uses bash para esto, sino que lo busques. Probablemente será más rápido y ciertamente más portátil (no todos los shells pueden manejar expresiones regulares):
find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'
Respuesta2
Es complicado, pero debería ser muy portátil:
#!/bin/sh para x en * hacer caso "$x" en [0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9]_[0-9][0- 9]_[0-9][0-9]) echo "$x coincidencias" ;; *) echo "$x no coincide" esac hecho # Y, para ser irritantemente completo, para x en .* hacer echo "$x no coincide" hecho