
Eu tenho uma lista de arquivos dentro de um diretório e quero criar um script bash que use uma expressão regular para verificar se cada nome de arquivo dentro dele tem esta sintaxe:
xxxx_xxxx_xx_xx
Onde x são números.
Edit: eu só preciso com o regex
Responder1
Que tal
#/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
A expressão regular verifica qualquer dígito ( [0-9]
). Os números entre chaves são o número de repetições, portanto [0-9]{4}
corresponderão a quaisquer 4 dígitos.
Eu recomendaria que você não usasse o bash para isso, mas sim o find. Provavelmente será mais rápido e certamente mais portátil (nem todos os shells podem lidar com expressões regulares):
find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'
Responder2
É desajeitado, mas deve ser muito portátil:
#!/bin/sh para x em * fazer caso "$x" em [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 corresponde" ;; *) echo "$x não corresponde" esac feito # E, para ser irritantemente completo, para x em .* fazer echo "$x não corresponde" feito