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


55

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

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" \; &

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


日付を追加するときは:、rsyncおよびscpでホストとして読み取られるため、使用しないようにしてください。stackoverflow.com/a/37143274/390066
kirill_igum

回答:


78

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

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

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

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


そのチームメイトのおかげで、その作業%100罰金今、ヘッドアップ&およびます。mkdir乾杯
I AM L

55

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

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

#!/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インタープリターで解釈します。todayという新しい変数を作成します。dateコマンドを実行し、Y、m、d、H、M、Sフラグを渡して出力を構成します。結果を日付変数に入れます。

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

それをワンライナーに詰め込み、lulzを増やします。

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

5

あなたはいくつかのことを混ぜたようです。

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_Logsegなどのディレクトリに移動するつもりでした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)。



2

この:

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

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


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