Добавление метки времени к имени файла с mv в BASH


Ну, я новичок в linux, и у меня проблема с простым скриптом bash.

у меня есть программа, которая добавляет в файл журнала во время его выполнения. Со временем этот файл журнала становится огромным. Я хотел бы создать сценарий запуска, который будет переименовывать и перемещать файл журнала перед каждым запуском, эффективно создавая отдельные файлы журнала для каждого запуска программы. Вот что я получил до сих пор:

сайт Pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

при запуске, я вижу это:

: command not found
program

когда я cd в каталог журналов и запустить dir, я вижу это:

201111211437r.logr

что происходит? Я предполагаю, что есть некоторые синтаксические проблемы, которые я пропускаю, но я не могу понять это.


UPDATE: благодаря комментарию Шеллера ниже, я обнаружил, что проблема связана с тем, что я редактирую файл .sh в Notepad++ в windows, а затем отправляю через ftp на сервер, где я запускаю файл через ssh. После запуска dos2unix на файл, это работает.

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

5 56

5 ответов:

несколько строк, которые вы опубликовали из своего сценария, выглядят нормально для меня. Возможно, это что-то более глубокое.

вам нужно найти, какая строка дает вам эту ошибку. Добавить set -xv в верхней части вашего скрипта. Это выведет номер строки и команду, которая выполняется в STDERR. Это поможет вам определить, где в вашем скрипте вы получаете эту ошибку.

кстати, у вас есть shebang в верхней части вашего скрипта? Когда я вижу что-то вроде этого, я обычно ожидаю, что это проблема с Shebang. Например, если у вас #! /bin/bash сверху, но ваш интерпретатор bash находится в /usr/bin/bash, вы увидите эту ошибку.

EDIT

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

два варианта:

  1. выберите редактировать - > преобразование EOL - >Unix Формат пункт меню при редактировании файла. После того, как он имеет правильные окончания строк, Notepad++ будет держать их.
  2. чтобы убедиться, что все новые файлы имеют правильные окончания строк, перейдите к Настройки->Предпочтения пункт меню, и потяните вверх предпочтения окне. Выберите Новый Документ / Каталог По Умолчанию tab. Под Новый Документ и радио. Нажмите кнопку закрыть.
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

Ну, это не прямой ответ на ваш вопрос, но в GNU/Linux есть инструмент, чья работа заключается в том, чтобы регулярно вращать файлы журналов, сохраняя старые на молнии до определенного предела. Это logrotate

метод одной строки в bash работает следующим образом.

[some out put] > $(дата "+%Y.%m.%d-%H.%M.%S").Вер

создаст файл с именем метки времени с расширением 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

вы можете писать свои сценарии в блокноте, но просто убедитесь, что вы их конвертируете используя это - > $ sed-i 's / \r$//' yourscripthere

Я использую его все время, когда я работаю в cygwin, и это работает. Надеюсь, это поможет