Как найти и отсортировать каталог по самому длинному пути к файлу?

Недостаточно использовать регулярные выражения. Проверка состоит из 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
03.12.2016, 01:56
2 ответа

Следующая команда даст вам количество символов для каждого обычного файла (удалите -тип f для всех типов файлов, включая каталоги) под каталогом, в котором вы выполняете его, и отсортируете их так, чтобы они были самыми длинными одни выводятся последними:

find . -type f -print|awk '{print length($0), $0}' | sort -n

Предполагается, что имена файлов и каталогов не содержат символов новой строки.

7
27.01.2020, 23:19

Вам нужен самый длинный путь или самое длинное имя файла? Между 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.

1
27.01.2020, 23:19

Теги

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