Подтвердить что ты не робот

Добавление метки времени в имя файла с 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 в файле он работает.

Новый вопрос: как я могу сохранить файл правильно в первую очередь, чтобы избежать необходимости выполнять это исправление при каждом повторном отправке файла?

4b9b3361

Ответ 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