Добавление метки времени в имя файла с mv в BASH
Ну, я новичок в Linux, и у меня проблема с простым bash script.
У меня есть программа, которая добавляет файл журнала во время его работы. Со временем этот файл журнала становится огромным. Я хотел бы создать startup script, который будет переименовывать и перемещать файл журнала перед каждым запуском, эффективно создавая отдельные файлы журналов для каждого запуска программы. Вот что у меня до сих пор:
pastebin
DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program
При запуске я вижу следующее:
: command not found
program
Когда я подключился к каталогу журналов и запустил dir, я вижу следующее:
201111211437\r.log\r
Что происходит? Я предполагаю, что есть какая-то проблема синтаксиса, которую я пропускаю, но я не могу понять, как это сделать.
UPDATE: спасибо комментарию, приведенному ниже, я обнаружил, что проблема связана с тем, что я редактирую файл .sh в Notepad ++ в Windows, а затем отправляю через ftp на сервер, где я запускаю файл через ssh. После запуска dos2unix в файле он работает.
Новый вопрос: как я могу сохранить файл правильно в первую очередь, чтобы избежать необходимости выполнять это исправление при каждом повторном отправке файла?
Ответы
Ответ 1
Несколько строк, которые вы отправили из вашего script, выглядят хорошо для меня. Это, вероятно, нечто более глубокое.
Вам нужно найти, какая строка дает вам эту ошибку. Добавьте set -xv
в начало script. Это напечатает номер строки и команду, выполняемую в STDERR. Это поможет вам определить, где в вашем script вы получаете эту конкретную ошибку.
Кстати, у вас есть shebang в верхней части вашего script? Когда я вижу что-то подобное, я обычно ожидаю, что это проблема с Шебангом. Например, если у вас #! /bin/bash
сверху, но ваш интерпретатор bash находится в /usr/bin/bash
, вы увидите эту ошибку.
ИЗМЕНИТЬ
Новый вопрос: как я могу сохранить файл правильно в первую очередь, чтобы избежать необходимости выполнять это исправление при каждом повторном отправке файла?
Два способа:
- При редактировании файла выберите пункт меню Edit- > EOL Conversion- > Unix Format. После того, как он имеет правильные окончания строки, Notepad ++ сохранит их.
- Чтобы убедиться, что все новые файлы имеют правильные окончания строк, перейдите в пункт меню "Настройки- > Настройки" и потяните диалоговое окно "Настройки". Перейдите на вкладку "Новый документ/каталог по умолчанию". В разделе "Новый документ и формат" выберите переключатель "Unix". Нажмите кнопку "Закрыть".
Ответ 2
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
Ответ 3
Метод с одной строкой внутри bash работает следующим образом.
[some out put] > $(date "+% Y.% m.% d-% H.% M.% S" ). ver
создаст файл с именем временной метки с расширением ver.
Список рабочих файлов, щелкнув снимок с именем файла даты, следующим образом, может показать, что он работает.
find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver
Конечно,
cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver
или даже проще
ls > $(date "+%Y.%m.%d-%H.%M.%S").ver
Ответ 4
Ну, это не прямой ответ на ваш вопрос, но есть инструмент в GNU/Linux, задачей которого является регулярное вращение файлов журнала, сохраняя старые, зашитые до определенного предела. Это logrotate
Ответ 5
Вы можете писать свои сценарии в блокноте, но просто убедитесь, что вы их конвертируете
используя это → $ sed -i 's/\ r $//' yourscripthere
Я использую все это, когда я работаю в cygwin, и это работает. Надеюсь, что это поможет
Ответ 6
Я использую эту команду для простого поворота файла:
mv output.log 'date +%F'-output.log
В локальной папке у меня есть 2019-09-25-output.log