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

85

Что ж, я новичок в Linux, и у меня проблема с простым сценарием bash.

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

пастебин

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

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

: command not found
program

Когда я cd в каталог журналов и запускаю dir, я вижу следующее:

201111211437\r.log\r

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


ОБНОВЛЕНИЕ: благодаря приведенному ниже комментарию шелтера, я обнаружил, что проблема связана с тем, что я редактирую файл .sh в Notepad ++ в Windows, а затем отправляю через ftp на сервер, где я запускаю файл через ssh . После запуска dos2unix в файле он работает.

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

Cat5InTheCradle
источник
2
\rэто carriage_return, проверьте свой сценарий bash, возможно, он включен в сценарий
ajreal
Откуда будет этот возврат каретки? Я предполагаю, что что-то logs/$DATE.logне так, но при вводе echo logs/$DATE.logвыводится правильный путь.
Cat5InTheCradle
откуда мне знать? пожалуйста, приложите соответствующий сценарий bash, вероятно, есть незаметные пробелы
аджреал
Добавлена ​​ссылка pastebin на основной пост, но этот фрагмент кода представляет собой буквально весь скрипт, я только что заменил строку, запускающую java .jar, на 'echo program'
Cat5InTheCradle
Понятия не имею ... кажется правильным, как насчет того, чтобы попытаться добавить несколько строк после DATE=$(date +"%Y%m%d%H%M")?
ajreal

Ответы:

24

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

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

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

РЕДАКТИРОВАТЬ

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

Два пути:

  1. Выберите формат Edit-> EOL Conversion-> Unix пункт меню при редактировании файла. Как только в нем будут правильные окончания строк, Notepad ++ сохранит их.
  2. Чтобы убедиться, что все новые файлы имеют правильные окончания строк, перейдите в пункт меню « Настройки» -> «Настройки» и откройте диалоговое окно « Настройки ». Выберите вкладку Новый документ / Каталог по умолчанию . В разделе « Новый документ и формат» выберите переключатель Unix . Нажмите кнопку " Закрыть" .
Дэвид В.
источник
Я посмотрю, смогу ли я это попробовать. Запуск dos2unix после отправки файла по ftp на мой Linux-сервер решает проблему, но я ищу способ обойти этот дополнительный шаг. У меня нет шебанга в начале, это может быть ключом.
Cat5InTheCradle
2
@AgentSnazz - Ага! Это проблема. Сценарии оболочки Unix должны иметь окончания строки Unix. Windows / MS-DOS использует возврат каретки и перевод строки (также известный как CRLF или \ r \ n) для обозначения конца строки. Unix использует только перевод строки (он же LF или \ n). Если вы редактируете файл для Unix на компьютере с Windows, вы должны использовать программный редактор, который может правильно завершать строки (например, Vim или Notepad ++ . Никогда не используйте Notepad . Вот почему вы видите \rв имени файла. В \rконце каждой строчки вашей программы есть невидимое .
Дэвид В.
83
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
dqw
источник
16
date +"%Y%m%d%H%M"если ваш bash немного другой
zinking
6
Для того, чтобы стресс @ Кованые изделия указывают, что должно не быть пробел между знаком плюс и двойные кавычки
PUK
9

Однострочный метод в bash работает так.

[вывод некоторых]> $ (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

Cyberience
источник
5

Я использую эту команду для простого поворота файла:

mv output.log `date +%F`-output.log

В локальной папке у меня есть 2019-09-25-output.log

Альфиоганг
источник
4

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

Дидье Троссет
источник
Я посмотрю на это, мне нравится мой метод, потому что он красиво завершает каждый запуск программы в своем собственном файле журнала.
Cat5InTheCradle
1

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

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

Макроуз
источник