У меня есть лучшее решение: сервер кэширования сквида. Сервер кэширования сквида, доступный для конфигурирования определения acl
а вы? deny
или accept
каждый acl
. Очень интересно, что команда сквида, определяющая ряд правил в их Wiki, которую Ваш вопрос нашел там iptables,PF
или другие не могут делать Ваших работ, потому что просто работают в другом, разделяет на уровни.
Необходимо заключить формат в кавычки до настоящего времени после +
знак.
$ date +"%Y/%m %b"
2013/10 Oct
Относительно переменных. $MOVEDIRSTR
кажется ненужным.
MOVEDIR=$(sed -r -e 's:([0-9]{4})([0-9]{2})([0-9]{2}).*:date -d \1-\2-\3 +%Y/%m_%b/%d:' <<< "$line")
С тех пор с $FLIST
Вы анализируете даты из того каталога, я не вижу более чистый путь.
Учитывая обратную связь OP в комментариях ниже, он использует устройство QNAP и настолько так имеет смягченную версию этих команд, обеспеченных BusyBox. Если Вы смотрите на команду даты как так: ls -l /bin/date
это - вероятно, ссылка на исполняемый файл, названный busybox или чем-то подобным. Эти команды не полнофункциональны, следовательно Ваши проблемы.
Он подтвердил это:
Вы, вероятно, правы. Моя дата является своим собственным исполняемым файлом, но/bin/sed-> busybox
Учитывая ограничения выше не могут работать методы, обсужденные, так как Вы работаете с ограниченным набором функций с этими инструментами.
В первую очередь, я использовал бы шарик, чтобы не анализировать ls и получать список .jpg
файлы тем окольным способом. Во-вторых, можно использовать саму оболочку (никакая потребность в sed
) извлечь компоненты даты:
shopt -s nullglob
for file in "$IMGDIR"/*.jpg; do
file_name="$(basename file)"
printf "%s\n" "$file_name"
numbers="${file%-*}"
year="${numbers%[0-9][0-9][0-9][0-9]}"
monthday="${numbers#[0-9][0-9][0-9][0-9]}"
month="${monthday%[0-9][0-9]}"
day="${monthday#[0-9][0-9]}"
movedir="$(date -d "$year-$month-$day" +"%Y/%m %b/)"
movefile="$(date -d "$year-$month-$day" +"%Y/%m %b/%d)"
[ -d "$ARCHIVEDIR/$movedir" ] || mkdir -p "$ARCHIVEDIR/$movedir"
mv "$file" "$movefile"
done
Это предполагает, конечно, что Ваш date
команда имеет достаточно полный набор функций, так как Вы упомянули, что это - отдельный исполняемый файл от BusyBox. Это также повредится, если Ваша строка даты не будет точно 8 цифрами долго.
посмотрите, могло ли следующее решить часть извлечения и форматирования даты:
$ f=20130131-abcdefgh.jpg
$ [[ $f =~ ^([[:digit:]]{4})([[:digit:]]{2})([[:digit:]]{2}) ]]
$ yyyy=${BASH_REMATCH[1]}
$ mm=${BASH_REMATCH[2]}
$ dd=${BASH_REMATCH[3]}
$ date -d ${yyyy}-${mm}-${dd} +'%Y/%m %b/%d'
2013/01 Jan/31
sh
разворачивает формат даты как'+"%Y/%m' '%b/%d"'
. Кроме того, по некоторым причинам$()
не работает иsh
попытки выполниться=date
, который не существует. Вот вывод, который я получаю, когда я пробую Ваш предложенный код:+++ sed -r -e 's:([0-9]{4})([0-9]{2})([0-9]{2}).*:date -d \1-\2-\3 +"%Y/%m %b/%d":'
++ =date -d 2013-10-27 '+"%Y/%m' '%b/%d"'
./dvrsnapshots.sh: line 25: =date: command not found
+
– Serge 27.10.2013, 07:56MOVEDIRSTR
кому: $ MOVEDIR= (sed -r -e 's:([0-9]{4})([0-9]{2})([0-9]{2}).*:date -d \1-\2-\3 +"%Y/%m_%b/%d":' <<< "$line"
) Было необходимо сохранить тильды в $ (). Все еще никакая удача с форматированием даты все же. – Serge 27.10.2013, 08:21/bin/sh
на устройстве QNAP. – Serge 27.10.2013, 08:24ls -l /bin/date
это - вероятно, ссылка на исполняемый файл, названный busybox или чем-то подобным. Эти команды не полнофункциональны, следовательно Ваши проблемы. – slm♦ 27.10.2013, 08:27