Verificación de nombres de archivo dentro de un directorio con expresiones regulares


5

Tengo una lista de archivos dentro de un directorio y quiero hacer un script bash que use una expresión regular para verificar si cada nombre de archivo tiene esta sintaxis:

xxxx_xxxx_xx_xx

Donde x son números.

Editar: solo necesito con la expresión regular

Respuestas:


8

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 verifica cualquier dígito ( [0-9]). Los números entre llaves son el número de repeticiones, por [0-9]{4}lo que coincidirán con 4 dígitos.

Recomendaría que no use bash para esto, sino que busque en su lugar. Probablemente será más rápido, y ciertamente es 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}'

No puedo construir un escenario que haga que su findcomando se rompa, pero sigo creyendo (en principios generales) que la expresión regular probablemente debería citarse, por seguridad.
Scott

@Scott Tiendo a estar de acuerdo con esas citas de precaución, pero no conozco ningún caparazón que se ahogue con eso. Aún así, como dijiste, más vale prevenir que curar. Cotizaciones agregadas.
terdon

Bien, recibí mi n + 1ª inyección de cafeína y lo descubrí. No es un problema de asfixia de shell , per se . Si hay un archivo en el directorio actual con un nombre como 5{4}_3{4}_0{2}_9{2}(y no tiene desactivado el bloqueo de shell), entonces \./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}(su expresión regular) se expandirá ./5{4}_3{4}_0{2}_9{2}y findsolo coincidirá ./5555_3333_00_99(si existe). ... ... (Por cierto, 5309 son los últimos cuatro dígitos del número de teléfono de Jenny.)
Scott

@ Scott ah, sí, ¡bien encontrado! Quien es Jenny? ¿O no debería preguntar?
terdon

¿Seriamente? Oh ya veo; no vives en un país principalmente de habla inglesa. Aqui tienes.
Scott

1

Es torpe, pero esto 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 coincide"
            ;;
        *)
            echo "$ x no coincide"
    esac
hecho
#                        Y, para ser molestamente completo,
para x pulg. *
hacer
    echo "$ x no coincide"
hecho

La misma expresión regular que usé, por cierto, creo que la solución provista por @terdon es más limpia. ¡Gracias de cualquier manera!
Federico Ponzi
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.