Циклические файлы с шаблоном даты в имени в Linux - PullRequest
2 голосов
/ 07 апреля 2020

Я пытаюсь использовать следующее для tar любого файла, к которому добавлена ​​дата:

#!/bin/bash

createDate=[0-9]{4}-[0-9]{2}-[0-9]{2}

for file in $HOME/test/*.log.$createDate ; do
    log=$(basename $file)
    find . -type f | tar -zcvf  $log.tar $log
done

Это должно tar для любого файла с датой, добавленной после расширения журнала, например test.log.2020-01-01 , Тем не менее, я получаю сообщение об ошибке:

tar: *.log.[0-9]{4}-[0-9]{2}-[0-9]{2}: Cannot stat: No such file or directory

Итак, он читает этот шаблон буквально как строку. Мне нужно, чтобы он использовал шаблон для сопоставления любого файла с этим форматом даты после расширения журнала. В конечном итоге это войдет в раздел postrotate для файла конфигурации logrotate, но я должен быть уверен, что он сначала работает.

1 Ответ

3 голосов
/ 07 апреля 2020

Вы используете этот шаблон в качестве шаблона оболочки:

createDate=[0-9]{4}-[0-9]{2}-[0-9]{2}

На самом деле это регулярное выражение, а не шаблон оболочки. Ваш глобальный совпадение не выполнено и дает только один результат: *.log.[0-9]{4}-[0-9]{2}-[0-9]{2}

Это поведение можно изменить с помощью:

shopt -s nullglob

Ваш скрипт должен быть изменен на этот :

shopt -s nullglob

for file in $HOME/test/*.log.[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]; do
    log=$(basename "$file")
    find . -type f | tar -zcvf "$log.tar" "$log"
done
...