5

У меня есть список файлов внутри каталога, и я хочу создать скрипт bash, который использует регулярное выражение, чтобы проверить, имеет ли каждое имя файла внутри него такой синтаксис:

xxxx_xxxx_xx_xx

Где х это числа.

Изменить: мне нужно только с регулярным выражением

2 ответа2

8

Как насчет

#/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

Регулярное выражение проверяет любую цифру ([0-9]). Числа в фигурных скобках - это количество повторений, поэтому [0-9]{4} будут соответствовать любым 4 цифрам.

Я бы порекомендовал вам не использовать Bash для этого, но вместо этого найти. Вероятно, это будет быстрее и, безусловно, более переносимо (не все оболочки могут работать с регулярными выражениями):

find -regextype posix-egrep -not -regex '\./[0-9]{4}_[0-9]{4}_[0-9]{2}_[0-9]{2}'
1

Это неуклюже, но это должно быть очень переносимо:

#!/bin/sh
for x in *
do
    case "$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 matches"
            ;;
        *)
            echo "$x  doesn’t match"
    esac
done
#                       And, to be annoyingly complete,
for x in .*
do
    echo "$x  doesn’t match"
done

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .