Перемещение пакетного файла к структуре каталогов на основе имени файла

У меня есть лучшее решение: сервер кэширования сквида. Сервер кэширования сквида, доступный для конфигурирования определения acl а вы? deny или accept каждый acl. Очень интересно, что команда сквида, определяющая ряд правил в их Wiki, которую Ваш вопрос нашел там iptables,PF или другие не могут делать Ваших работ, потому что просто работают в другом, разделяет на уровни.

1
27.10.2013, 08:26
3 ответа

Необходимо заключить формат в кавычки до настоящего времени после + знак.

$ 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 Вы анализируете даты из того каталога, я не вижу более чистый путь.

ОБНОВЛЕНИЕ № 1

Учитывая обратную связь OP в комментариях ниже, он использует устройство QNAP и настолько так имеет смягченную версию этих команд, обеспеченных BusyBox. Если Вы смотрите на команду даты как так: ls -l /bin/date это - вероятно, ссылка на исполняемый файл, названный busybox или чем-то подобным. Эти команды не полнофункциональны, следовательно Ваши проблемы.

Он подтвердил это:

Вы, вероятно, правы. Моя дата является своим собственным исполняемым файлом, но/bin/sed-> busybox

Учитывая ограничения выше не могут работать методы, обсужденные, так как Вы работаете с ограниченным набором функций с этими инструментами.

1
27.01.2020, 23:29
  • 1
    не работают на меня по некоторым причинам. 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:56
  • 2
    @Serge - У меня была опечатка с установкой переменной. Повторите. Также Вы используете sh или удар? Вы отметили Q как удар. –  slm♦ 27.10.2013, 08:06
  • 3
    я упростил 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") Было необходимо сохранить тильды в $ (). Все еще никакая удача с форматированием даты все же. –  Serge 27.10.2013, 08:21
  • 4
    я работаю /bin/sh на устройстве QNAP. –  Serge 27.10.2013, 08:24
  • 5
    @Serge - Вы, вероятно, используете смягченную версию этих команд, обеспеченных BusyBox. Если Вы смотрите на команду даты как так: ls -l /bin/date это - вероятно, ссылка на исполняемый файл, названный busybox или чем-то подобным. Эти команды не полнофункциональны, следовательно Ваши проблемы. –  slm♦ 27.10.2013, 08:27

В первую очередь, я использовал бы шарик, чтобы не анализировать 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 цифрами долго.

1
27.01.2020, 23:29

посмотрите, могло ли следующее решить часть извлечения и форматирования даты:

$ 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
1
27.01.2020, 23:29

Теги

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