Как я проверяю, что имя файла соответствует шаблону?

В контексте Unix или процесса Linux, фраза "стек" может означать две вещи.

Во-первых, "стек" может означать записи метода "последним пришел - первым вышел" вызывающей последовательности потока управления. Когда процесс выполняется, main() назван первым. main() мог бы звонить printf(). Код, сгенерированный компилятором, пишет адрес строки формата и любые другие аргументы printf() к некоторым ячейкам памяти. Затем код пишет адрес, к которому поток управления должен возвратиться после printf() концы. Затем код называет переход или ответвление к запуску printf(). Каждый поток имеет одну из этих функциональных стопок записи активации. Обратите внимание, что много центральных процессоров имеет аппаратные инструкции для установки и поддержания стека, но что другие центральные процессоры (IBM 360, или независимо от того, что это называют) на самом деле используемые связанные списки, которые могли потенциально быть рассеяны об адресном пространстве.

Во-вторых, "стек" может означать ячейки памяти, в которые ЦП пишет аргументы функциям и адрес, к которому должна возвратиться позвонившая функция. "Стек" относится к непрерывной части адресного пространства процесса.

Память в Unix или Linux или *процесс BSD является очень длинной строкой, запускающейся приблизительно в 0x400000 и заканчивающейся приблизительно в 0x7fffffffffff (на x86_64 центральных процессорах). Адресное пространство стека запускается в самом большом числовом адресе. Каждый раз, когда функция вызвана, стопка функции activatio записи "углубляется": код процесса помещает аргументы функции и обратный адрес на стопке записей activatio, и постепенно уменьшает указатель вершины стека, специальный регистр ЦП раньше отслеживал то, где в адресном пространстве стека, процесс значения текущих переменных находятся.

Каждый поток добирается, часть "стека" (сложите адресное пространство) для его собственного использования в качестве функциональной стопки записи активации. Где-нибудь между 0x7fffffffffff и более низким адресом, каждый поток имеет область памяти, зарезервированной для использования в вызовах функции. Обычно это только осуществляется условно, не аппаратные средства, поэтому если Ваш поток вызывает функцию после вложенной функции, дна, которого стека потока может перезаписать вершину стопки другого потока.

Таким образом, каждый поток имеет часть "стека" область памяти, и это - то, куда "общий стек" терминология прибывает из. Это - последствие адресного пространства процесса, являющегося единственным линейным блоком памяти и двумя использованием термина "стек". Я вполне уверен, что у некоторых более старый JVMs (действительно древний) в действительности только, был единственный поток. Любая поточная обработка в коде Java была действительно сделана единственным реальным потоком. Более новый JVMs, JVMs, кто вызывает реальные потоки, чтобы сделать потоки Java, будет иметь тот же "общий стек", я описываю выше. Linux и План 9 имеют запускающий процесс системный вызов (клон () для Linux, rfork () в Плане 9), который может настроить процессы, которые совместно используют части адресного пространства и возможно различных адресных пространств стека, но тот стиль поточной обработки никогда действительно завоевал популярность.

2
29.01.2014, 16:48
2 ответа

Принятие Вас использует последнюю версию zsh, ksh93 или bash и имя файла не содержит символы новой строки:

# split up the filename into its parts
IFS=_ read -r pjid env srcid desc date seq free <<< "$filename"

# extract the codepage from the free text
code=${free##*.}
free=${free%.*}

# validate
if  [[ $pjid  =~ ^[[:alnum:]]{3,8}$ ]]                                  &&
    [[ $env   == "DEV" || $env == "SYT" || ... ]]                       &&
    [[ $srcid =~ ^[[:digit:]]+$ ]]                                      &&
    [[ $desc  =~ ^[[:alnum:]]+$ ]]                                      &&
    [[ $date  =~ ^[[:digit:]]{8}$ ]] && date -d "$date" >/dev/null 2>&1 &&
    [[ $seq   =~ ^[[:digit:]]+$ ]]                                      &&
    [[ $free  =~ ^[[:alnum:]]+$ ]]                                      &&
    [[ $code  =~ ^[[:alnum:]]+$ ]]  # need specific codepage validation?
then
    echo "file name format is OK"
fi
5
27.01.2020, 21:54
  • 1
    @stephane. Я имею и продолжаю извлекать уроки из Вашего внимания к деталям. –  glenn jackman 28.01.2014, 18:57

Моя находка-fu слаба сегодня, таким образом, я не мог добраться, находят для принятия моего regex с-regex/-iregex и различными-regextype опциями.

Этот немного медленнее, но надо надеяться выручит Вас:

$ find . -maxdepth 1 -type f | grep -P '[[:alnum:]]{3,8}_(DEV|SYT|SIT|UAT|PRD)_\d+_[[:alnum:]]+_\d\d\d\d[0-1]\d[0-3]\d_\d\d_[[:alnum:]]+\.[[:alnum:]]+'

./ABC_PRD_00227_ACC_20130128_01_LTSB.CP1252

Принятие Вас хочет найти файлы, не соответствующие шаблону, просто добавить, что-v переключаются на grep.

1
27.01.2020, 21:54

Теги

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