Додавання мітки часу до імені файлу за допомогою mv у BASH


85

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

У мене є програма, яка додає файл журналу під час роботи. З часом цей журнал стає величезним. Я хотів би створити сценарій запуску, який буде перейменовувати та переміщувати файл журналу перед кожним запуском, фактично створюючи окремі файли журналу для кожного запуску програми. Ось що я маю на даний момент:

пастебін

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

При запуску я бачу таке:

: command not found
program

Коли я відтворюю компакт-диск у каталозі журналів і запускаю каталог, я бачу таке:

201111211437\r.log\r

Що відбувається? Я припускаю, що у мене є якась проблема синтаксису, але я, здається, не можу цього зрозуміти.


ОНОВЛЕННЯ: Завдяки коментарю shellter нижче, я виявив, що проблема пов’язана з тим, що я редагую файл .sh у Notepad ++ у Windows, а потім надсилаю через ftp на сервер, де я запускаю файл через ssh . Після запуску dos2unix у файлі він працює.

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


2
\ris carriage_return,
вивчіть

Звідки взялося б те повернення карети? Я здогадуюсь, що щось про щось logs/$DATE.logне так, але введення echo logs/$DATE.logвидає правильний шлях.
Cat5InTheCradle

звідки я знаю? будь-ласка, приєднайте відповідний сценарій bash, ймовірно, там є непомітні пробіли
ajreal

Додано посилання pastebin до головного повідомлення, але цей фрагмент коду - це буквально весь сценарій, я щойно замінив "echo program" на рядок, який запускає java .jar
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'd на мій сервер 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

16
date +"%Y%m%d%H%M"якщо ваш удар трохи інший
цинкування

6
Для того, щоб стрес @ Ковані вироби вказують, що повинно НЕ бути пробіл між знаком плюс і подвійні лапки
PUK

9

Однорядковий метод у bash працює так.

[деякі з них]> $ (дата "+% 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


5

Я використовую цю команду для простого обертання файлу:

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

У локальній папці у мене є 2019-09-25-output.log


4

Ну, це не пряма відповідь на ваше запитання, але в GNU / Linux є інструмент, завдання якого - регулярно обертати файли журналів, зберігаючи старі файли у стиснутих до певної межі. Йогоlogrotate


Я розгляну це, мені подобається мій метод, тому що він красиво обертає кожен запуск програми у власний файл журналу.
Cat5InTheCradle

1

Ви можете писати свої сценарії в блокноті, але просто переконайтеся, що перетворили їх за допомогою цього -> $ sed -i 's / \ r $ //' ваш скрипт тут

Я використовую це весь час, коли я працюю в cygwin, і це працює. Сподіваюся, це допомагає

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.