Недостаточно использовать регулярные выражения. Проверка состоит из 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, чтобы сделать то же самое.
Следующая команда даст вам количество символов для каждого обычного файла (удалите -тип f
для всех типов файлов, включая каталоги) под каталогом, в котором вы выполняете его, и отсортируете их так, чтобы они были самыми длинными одни выводятся последними:
find . -type f -print|awk '{print length($0), $0}' | sort -n
Предполагается, что имена файлов и каталогов не содержат символов новой строки.
Вам нужен самый длинный путь или самое длинное имя файла? Между foo/bar/baz
и foobar
, это foo/bar/baz
(самый длинный путь), или foobar
(имя длиннее, чем baz
)?
С zsh
:
path_length() REPLY=$#REPLY
name_length() REPLY=${#REPLY:t}
# longest name:
ls -ld -- **/*(DnO+name_length[1])
# longest path:
ls -ld -- **/*(DnO+path_length[1])
Обратите внимание, что он считает эти длины в количестве символов, а не байт. Вы можете изменить локаль на C, чтобы считать в байтах, но тогда мы не будем знать, как кодируются имена файлов на удаленном хосте и что входит в тот лимит, о котором вы говорите. Например, € кодируется одним байтом в iso8859-15, двумя в UTF-16 и тремя в UTF-8.