Проверка формата имени файла в linux shell

Вы можете использовать Vim в режиме Ex:

ex -sc 'g/\.png/d' -cx file
  1. g глобальный поиск

  2. d удалить

  3. x сохранить и закрыть

1
07.07.2017, 22:50
4 ответа

звучит как:

TOCHECK=( "01-20170228-12345678" "012-20170230-012345678" "01-20170228-12345678" "123-20170730-012345678" )

for CHECK in $(seq 0 $(( ${#TOCHECK[@]}-1 )) ); do
    PARTS=( $(echo ${TOCHECK[$CHECK]} | sed "s/-/ /g")   )   
    echo -ne "\nchecking "
    echo "\"${PARTS[@]}\""
    echo "\"${PARTS[0]}\""
    echo "\"${PARTS[1]}\""
    echo "\"${PARTS[2]}\""

    if echo ${PARTS[0]} | grep "[0-9]\{3\}" ; then
        echo first part ok
    fi

    if echo ${PARTS[2]} | grep "[0-9]\{9\}" ; then
        echo last part ok
    fi  

    date --date="${PARTS[1]}"
    RES=$?
    echo $RES
    if [ 0$RES -eq 0 ]; then
        echo date OK
    fi  
done

(просто некоторая концептуальная идея, разумеется, с изменениями)

1
28.04.2021, 23:59

Это проверяет каждый файл в текущем каталоге с помощью оператора bash [[на соответствие шаблону:

  • начало строки^
  • 3 цифры
  • -
  • 8 цифр
  • -
  • 9 цифр
  • .pdf
  • конец строки$
  • что средние 8 цифр оцениваются как действительная дата в соответствии с датой GNU

Вы можете достаточно легко скорректировать приведенные выше допущения.

for f in *
do
  [[ $f =~ ^([0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9])-([0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]).pdf$ ]] && 
  date -d ${BASH_REMATCH[2]} &>/dev/null && 
  echo Valid: "$f"
done
2
28.04.2021, 23:59

Недостаточно использовать регулярные выражения. Проверка состоит из 2 шагов :сопоставления регулярных выражений и проверки даты. Вот реализация Python:

from __future__ import print_function
import sys 
import re
import datetime

def validate(filename):
    match = re.match(r"[0-9]{3}-([0-9]{8})-[0-9]{8}\.pdf", filename)
    if not match:
        return False
    datestr = match.group(1)
    try:
        datetime.date(int(datestr[:4]), int(datestr[4:6]), int(datestr[6:8]))
    except ValueError:
        return False
    else:
        return True

if __name__ == "__main__":
    if validate(sys.argv[1]):
        print(":-)")
        sys.exit(0)
    else:
        print(":-(")
        sys.exit(1)

Использование:python validate.py FILE

Вероятно, можно использовать grep и date, чтобы сделать то же самое.

1
28.04.2021, 23:59

Одно базовое решение с использованием grep. Не выполняет подробный аспект проверки даты, вместо этого просто проверяет его числовое значение.

if ls|grep -vE '^[0-9]{3}-[0-9]{8}-[0-9]{8}\.pdf$'; then
    echo some bogus files found
else
    echo all good
fi
1
28.04.2021, 23:59

Теги

Похожие вопросы