次のように、ファイル名の最後に現在の日付を追加しようとしています:
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" \; &
ただし、取得するのはファイルの名前だけで、何も追加されません。ファイル名に現在の日付を追加するにはどうすればよいですか?
おそらくset
の使用です。これにより、「今日」、「=」、およびdate
プログラムの出力が定位置パラメーター(別名コマンド行引数)に割り当てられます。 Cシェル(これを「bash」としてタグ付けしているので、そうでない可能性が高い)だけを使用したい場合は、次のように使用します。
today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire
等号の周囲にスペースがないことに注意してください。
また、ステートメントの最後に&
を使用したくありません。これにより、シェルはコマンドの終了を待たなくなります。特に、次のものに依存している場合。 find
コマンドはmkdir
の前に開始されるため、失敗する可能性があります。
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"
あなたはいくつかのことを混同しているようです。
_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"`
この:
find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &
うまくいくはずです。あなたはcshを使用しているようですが、+記号を削除する私の解決策はうまくいかないかもしれませんが、試しても害はありません。変数を中括弧{}で囲むことは、予期しない変数の展開を防ぐために常に良い考えです。