BASHでmvを使用してファイル名にタイムスタンプを追加する


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

どうしたの?欠落している構文の問題があると思いますが、理解できないようです。


更新:以下のshellterのコメントのおかげで、WindowsのNotepad ++で.shファイルを編集し、ftp経由でサーバーに送信し、そこでssh経由でファイルを実行していることが問題であることがわかりました。 。ファイルに対してdos2unixを実行すると、機能します。

新しい質問:ファイルを再送信するたびにこの修正を実行する必要がないように、最初にファイルを正しく保存するにはどうすればよいですか?


2
\rはキャリッジ
リターンです。bash

そのキャリッジリターンはどこから来るのでしょうか?何かlogs/$DATE.logがおかしいと思いますが、入力echo logs/$DATE.logすると正しいパスが出力されます。
Cat5InTheCradle 2011

どうすればわかりますか?対応するbashスクリプトを添付してください。目立たない空白がある可能性があります
ajreal

メインの投稿にペーストビンのリンクを追加しましたが、そのコードスニペットは文字通りスクリプト全体
です。java.jar

わからない...正しいようDATE=$(date +"%Y%m%d%H%M")ですが、?の後にいくつかの文字列を追加してみてはどうでしょうか。
ajreal 2011

回答:


24

スクリプトから投稿した数行は、私には問題ないように見えます。それはおそらくもう少し深いものです。

このエラーが発生している行を見つける必要があります。set -xvスクリプトの先頭に追加します。これにより、行番号と実行中のコマンドがSTDERRに出力されます。。これは、スクリプトのどこでこの特定のエラーが発生しているかを特定するのに役立ちます。

ところで、スクリプトの上部にシバンがありますか?私がこのようなものを見たとき、私は通常、Shebangの問題を予期しています。たとえば、#! /bin/bash上にいて、bashインタープリターがにある/usr/bin/bash場合、このエラーが表示されます。

編集

新しい質問:ファイルを再送信するたびにこの修正を実行する必要がないように、最初にファイルを正しく保存するにはどうすればよいですか?

二つの方法:

  1. ファイルを編集するときは、[編集]- > [EOL変換]- > [Unix形式]メニュー項目を選択します。正しい行末が設定されると、Notepad ++はそれらを保持します。
  2. すべての新しいファイルの行末が正しいことを確認するには、[設定]-> [設定]メニュー項目に移動し、[設定]ダイアログボックスを表示します。[新しいドキュメント/デフォルトディレクトリ]タブを選択します。下に新規ドキュメントフォーマット、選択Unixのラジオボタンを。[閉じる]ボタンをクリックします。

私はそれを試すことができるかどうかを確認します。ファイルがLinuxサーバーにftpで転送されたらdos2unixを実行すると問題は解決しますが、その余分な手順を回避する方法を探しています。私は最初はシバンを持っていません、それが鍵かもしれません。
Cat5InTheCradle 2011

2
@ AgentSnazz-あはは!それが問題です。Unixシェルスクリプトには、Unix行末が必要です。Windows / MS-DOSは、キャリッジリターンラインフィード(別名CRLFまたは\ r \ n)を使用して行の終わりをマークします。Unixは改行(別名LFまたは\ n)のみを使用します。Windowsマシン上でUnix用のファイルを編集している場合は、次のような正しい行末(行うことができ、プログラムエディタを使用する必要がありVimのか、メモ帳を++これまでに、メモ帳を使用しないでください。あなたが見ている理由の\rファイル名に。目に見えないがあります\rあなたのプログラム内の各行の終わりに。
デビッド・W.

83
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log

16
date +"%Y%m%d%H%M"あなたのbashが少し違う場合
2014

6
@zinkingのポイントを強調するために、プラス記号と二重引用符の間にスペースがあってはなりませ
puk 2017

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


5

このコマンドを使用して、ファイルを単純に回転します。

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

ローカルフォルダにあります 2019-09-25-output.log


4

さて、それはあなたの質問に対する直接の答えではありませんが、GNU / Linuxには、ログファイルを定期的にローテーションし、古いファイルを特定の制限まで圧縮したままにするツールがあります。それはlogrotate


それを見てみましょう。プログラムの実行ごとに独自のログファイルにうまくまとめられるので、私の方法が好きです。
Cat5InTheCradle 2011

1

スクリプトはメモ帳で書くことができますが、必ずこれを使用して変換してください-> $ sed -i's / \ r $ // 'yourscripthere

私はcygwinで作業しているときに常に使用しており、機能します。お役に立てれば

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.