
Ich habe eine Liste von Dateien in einem Verzeichnis und möchte ein Bash-Skript erstellen, das mithilfe eines regulären Ausdrucks überprüft, ob alle darin enthaltenen Dateinamen diese Syntax haben:
xxxx_xxxx_xx_xx
Wobei x Zahlen sind.
Bearbeiten: Ich brauche nur den regulären Ausdruck
Antwort1
Wie wäre es mit
#/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
Der reguläre Ausdruck sucht nach beliebigen Ziffern ( [0-9]
). Die Zahlen in geschweiften Klammern geben die Anzahl der Wiederholungen an und [0-9]{4}
stimmen daher mit allen 4 Ziffern überein.
Ich würde empfehlen, hierfür nicht bash, sondern find zu verwenden. Das ist wahrscheinlich schneller und sicherlich portabler (nicht alle Shells können mit regulären Ausdrücken umgehen):
find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'
Antwort2
Es ist klobig, sollte aber sehr portabel sein:
#!/bin/sh für x in * Tun Fall "$x" in [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 Übereinstimmungen" ;; *) echo "$x stimmt nicht überein" esac Erledigt # Und um ärgerlich vollständig zu sein: für x in .* Tun echo "$x stimmt nicht überein" Erledigt