for i in $(ls $INPUT_DIR | egrep -i '^'$INPUT_FILE_PREFIX'[0-9][0-9]([0][1-9]|1[0-2])([0][1-9]|[12][0-9]|[3][01])'$INPUT_FILE_SUFFIX);
В общем, нет причин использовать
ls
в такой структуре, это просто делает команду более неудобной для чтения, плюс вы столкнетесь с проблемами в некоторых крайних случаях (см. ParsingLs в BashGuide ). Однако регулярное выражение, которое у вас есть, не может быть представлено в виде стандартного глобуса оболочки, поэтому есть смысл его использовать. Хотя, поскольку это было помечено с помощью bash , мы можем сделать это в оболочке, либо с помощьюextglob
(, либо используя совпадения регулярных выражений с конструкцией[[.. ]]
после более широкого glob ).shopt -s extglob for i in "$INPUT_DIR/$INPUT_FILE_PREFIX"[0-9][0-9]@(0[1-9]|1[0-2])@(0[1-9]|[12][0-9]|3[01])"$INPUT_FILE_SUFFIX" ; do
Если вам действительно не нужен такой строгий шаблон, вы можете просто использовать вместо него
[0-9][0-9][0-9][0-9][0-9][0-9]
.В назначении
MYDATE
я предполагаю, что вы просто хотите удалить префикс и суффикс. (хотя, если ваш префикс/суффикс содержит строку из шести -цифр, grep также будет соответствовать этому.)MYDATE=${i#"$INPUT_DIR/"} # remove the directory MYDATE=${MYDATE#"$INPUT_FILE_PREFIX"} # remove the prefix MYDATE=${MYDATE%"$INPUT_FILE_SUFFIX"} # and the suffix
Полностью:
shopt -s extglob for i in "$INPUT_DIR/$INPUT_FILE_PREFIX"[0-9][0-9]@(0[1-9]|1[0-2])@(0[1-9]|[12][0-9]|3[01])"$INPUT_FILE_SUFFIX" ; do MYDATE=${i#"$INPUT_DIR/"} # remove the directory MYDATE=${MYDATE#"$INPUT_FILE_PREFIX"} # remove the prefix MYDATE=${MYDATE%"$INPUT_FILE_SUFFIX"} # and the suffix echo "$MYDATE" done