Чрезвычайно глупо пытаться анализировать вывод команды ls
, который не предназначен для анализадля передачи команды, которая не предназначена для работы с несколькими символами(например: новые строки
и {}
), когда оболочка делает это сама:
set -- *; for f; do echo "<$f>"; done
set -- *
for f
do ls "$f"
done
Или в одной командной строке:
$ set -- *; for f; do echo "<$f>"; done
<-name-with-dash-prefix>
Обратите внимание, что вывод работает (и имеет n примеров в качестве последнего имени файла) с символами новой строки.
Или, если количество файлов делает оболочку медленной, используйте find:
$ find ./ -type f -exec echo '<{}>' \;
<./safe-name>
<./with_a
newline>
<./name-with-double-quote">
<./-name-with-dash-prefix>
<./name with space>
<./name-with-single-quote'>
<./name-with-backslash\>
Только учтите, что find обрабатывает все точечные файлы и все подкаталоги иначе, чем оболочка.
Я использовал способность Awk оценивать конструкцию имени файла, включая сегодняшнюю дату, при каждой оценке (для каждой строки, которая происходит из журнала) и в итоге получил:
tail -F mylatestlogfile.log | grep "ERROR" | awk '{print >> "/tmp/myerrors/errors." strftime("%Y-%m-%d") ".log"}'
Вы можете попробовать следующий код в качестве скрипта bash
:
#!/bin/bash
while getopts "d:f:e:r:a" opt; do
case $opt in
f) FDATE=$(awk -v fmt="$OPTARG" '{print strftime(fmt)}'<<<DUMMY) ;;
r) PREFIX="$OPTARG" ;;
e) SUFFIX="$OPTARG" ;;
d) DEST="$OPTARG" ;;
a) APPEND=true ;;
esac
done
if [ ! $APPEND ]
then
> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}
fi
while read line; do echo ${line} >> ${DEST}/${PREFIX}.${FDATE}.${SUFFIX}; done
Вы также можете окружить тело скрипта:
pushtolog()
{
...
}
и источник.
Я также включил флаг, позволяющий добавлять к существующим данным. Должно быть легко изменить сценарий по умолчанию для добавления и перезаписи, когда задана конкретная опция.
Примечание 1 : формат даты должен соответствовать strftime
(см. man strftime
), поэтому используйте «% Y-% m-% d»
Примечание 2 : эта переменная APPEND
на самом деле не является логическим значением, я просто предполагаю, что это так. Возможно, лучше использовать APPEND = "true"
и , если [-z "$ APPEND"]