Все, что я нашел в Интернете, похоже, указывает на то, что шифрование в настоящее время еще не реализовано драйвером файловой системы Linux cifs. Кроме того, в man-странице mount.cifs (8) моего Centos 7 для опции 'sec =' нет режима, указывающего шифрование пакета, только подписание пакета (режимы с 'i', добавленным к их обычным именам). Для сравнения, на странице руководства nfs (5) перечислены режимы с добавленной буквой «i» для подписи пакетов, а также режимы с добавленной буквой «p» для полного шифрования пакета.
Я считаю, что это еще не доступно для Linux.
Похоже, вы пытаетесь разобрать шестизначное число в именах файлов, которые начинаются с $INPUT_FILE_PREFIX
и заканчиваются на $INPUT_FILE_SUFFIX
.
Так и будет:
for name in "$INPUT_DIR/$INPUT_FILE_PREFIX"??????"$INPUT_FILE_SUFFIX"; do
test -f "$name" || continue
number=${name#$INPUT_DIR/$INPUT_FILE_PREFIX}
number=${number%$INPUT_FILE_SUFFIX}
printf "Number = %s\n" "$number"
done
Измените каждый ?
на [0-9]
, если вы хотите быть уверенным, что совпадение только цифр(?
соответствует одному символу независимо от того, что это за символ ).
Подстановка параметров в цикле удаляет первую часть значения $name
, а затем последнюю часть оставшейся строки, оставляя число (из шести символов между префиксом и суффиксом )в середине в качестве единственное, что осталось в переменной $number
.
Команда
MYDATE=$("$i" | grep -oP '\d{6,6}')
Как вы обнаружили, будет интерпретироваться как вызов всего, что находится в $i
, как команды. В то же время вы сказали, что если поставить echo
перед "$i"
, это заставит его работать, что и происходит :
MYDATE=$(echo "$i" | grep -oP '\d{6,6}')
Связано с вашим кодом:Почему *не *parse `ls `?
Su script está pasando "$i" como una cadena, pero le está diciendo al shell que lo use como un comando. La línea que dice
MYDATE=$("$i" | grep -oP '\d{6,6}')
le dice al shell :"Expande la variable i
, luego ejecuta el comando resultante $i,alimentando su salida a través de este comando grep
, y asigne el resultado a la variable MYDATE". El $(...)
hace lo mismo que la construcción de doble acento grave que usa con el comando echo "$i" | grep -oP '\d{6,6}'
que lo hace funcionar. Simplemente necesita el echo
comando en cualquiera de ellos para obtener los resultados que desea.
¿Has probado la sustitución del proceso bash ? Parece que haría que su comando fuera mucho más fácil y sin necesidad de bucles o variables.
Básicamente, la sustitución de procesos no es muy conocida, pero puede ser extremadamente poderosa.
Process substitution feeds the output of a process (or processes) into the stdin of another process.
entonces, su comando podría reducirse a algo como esto:
grep -oP '\d{6,6}'<(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 $INPUT_DIR))
La lógica detrás de esto se entiende mejor con una versión más simple:
user@yrmv-191108:~/nums$ ls.
1 10 2 3 4 5 6 7 8 9
user@yrmv-191108:~/nums$ grep 1 <(ls.)
1
10
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
Я бы порекомендовал несколько иной способ циклического перебора имен файлов --с использованием bash расширенной подстановки для сбора имен файлов:
shopt -s extglob
for d in "${INPUT_DIR}"/"${INPUT_FILE_PREFIX}"[0-9][0-9]@(0[1-9]|1[0-9])@(0[1-9]|[12][0-9]|3[01])"${INPUT_FILE_SUFFIX}"
do
[[ $d =~ ${INPUT_FILE_PREFIX}([[:digit:]]+)${INPUT_FILE_SUFFIX} ]]
MYDATE=${BASH_REMATCH[1]}
done
Синтаксис подстановки почти такой же, как у вашего оператора grep. Каждый набор @(...)
вводит запрос на соответствие любому из заданных шаблонов, которые разделены |
. Я заметил, что (предполагаемый шаблон дня )для [3]
был одним классом символов -, поэтому я удалил окружающие его скобки.
Когда у нас есть имена файлов в цикле for
, вы можете использовать оператор регулярного выражения =~
условного выражения bash, чтобы вырезать цифры в MYDATE.