web-dev-qa-db-ja.com

変数からファイル名に現在の日付を追加する

次のように、ファイル名の最後に現在の日付を追加しようとしています:

TheFile.log.2012-02-11

ここに私がこれまでに持っているものがあります:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

ただし、取得するのはファイルの名前だけで、何も追加されません。ファイル名に現在の日付を追加するにはどうすればよいですか?

60
I AM L

おそらくsetの使用です。これにより、「今日」、「=」、およびdateプログラムの出力が定位置パラメーター(別名コマンド行引数)に割り当てられます。 Cシェル(これを「bash」としてタグ付けしているので、そうでない可能性が高い)だけを使用したい場合は、次のように使用します。

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

等号の周囲にスペースがないことに注意してください。

また、ステートメントの最後に&を使用したくありません。これにより、シェルはコマンドの終了を待たなくなります。特に、次のものに依存している場合。 findコマンドはmkdirの前に開始されるため、失敗する可能性があります。

85
Arcege

ファイル名に日付を挿入するBashスクリプト:

a.shというファイル内のこのbashコード

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

実行すると、印刷:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

コードの説明:

/ bin/bashインタープリターでスクリプトを解釈します。今日と呼ばれる新しい変数を作成します。 Y、m、d、H、M、Sフラグを渡して日付コマンドを実行し、出力を構成します。結果を日付変数に入れます。

Filenameという新しい変数を作成し、$ today変数を残りの静的ファイル名テキストで囲みます。次に、ファイル名を画面にエコーします。

lulzを増やすためにワンライナーに詰め込む:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
58
Eric Leschinski

あなたはいくつかのことを混同しているようです。

_set today = 'date +%Y'_はtcsh構文に似ていますが、tcshでも文字列_date +%Y_を変数todayに割り当てますが、dateコマンドは実行されません。おそらくbashまたは他のPOSIXシェルを使用しているため、割り当ての構文は_today=some_value_(等号の前後にスペースなし)です。コマンドを実行し、その出力を変数に割り当てるには、 コマンド置換 を使用します。

_today=$(date +%Y-%m-%d)
_

(日付の指定も完了しました)。ドル括弧の代わりにバッククォートを使用できますが、視覚的にフォワードクォートと混同される傾向があり、バッククォートされたコマンド内でクォートが必要な場合のルールはかなり複雑で実装に依存するため、$(…)(saner構文でも同じ効果があります)。

いくつかのコマンドの最後に_&_を使用しました。これにより、コマンドはバックグラウンドで実行されますが、ここでは不要です。 _&&_を意味していたのではないかと思います。つまり、最初のコマンドが成功した場合にのみ次のコマンドを実行します。

_today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find …
_

各コマンドの後に_&&_を使用する代わりに、_set -e_でスクリプトを開始することもできます。これは、コマンドがゼロ以外のステータスを返すとすぐにスクリプトの実行を停止するようにシェルに指示します(if条件のコマンドおよびいくつかの他の場合を除く)。

_set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find …
_

あなたのfindコマンドは問題ありませんが、おそらくあなたがしようとしていることをしません(それが何であるかは私にはわかりませんが)。

mkdirでディレクトリを作成し、すぐにfindでトラバースします。ディレクトリが既に存在しない限り、これは役に立ちません。今日のログ用のディレクトリを作成し、最近のファイルを_The_Logs_から、たとえば、 _The_Logs.2012-02-11_?

_mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;
_

または、今日のログファイルの名前を変更して、サフィックス_$today_を追加しますか?そのため、移動するファイルごとに異なるファイル名を計算する必要があります。

_find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;
_

変更時刻に基づいてファイルを移動するために_-mtime_を使用したことに注意してください。ファイルが最後に読み取られた時刻である_-atime_ではありません(システムがそれを追跡している場合—ない場合) 、atimeはmtimeまでさかのぼることができます)。

タイムスタンプが付加されたファイルの名前を変更できます

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
3
Atul Rokade

この:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

うまくいくはずです。あなたはcshを使用しているようですが、+記号を削除する私の解決策はうまくいかないかもしれませんが、試しても害はありません。変数を中括弧{}で囲むことは、予期しない変数の展開を防ぐために常に良い考えです。

2
MelBurslan