変数の現在の日付をファイル名に追加します。

変数の現在の日付をファイル名に追加します。

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

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

しかし、私が取得するのはファイル名だけで、ファイルに何も追加されません。ファイル名に現在の日付を追加するには?

答え1

おそらくそれを使ったでしょうset。これは、「today」、「=」、およびプログラムの出力をdate位置引数(コマンドライン引数とも呼ばれる)に割り当てます。 Cシェルを使用したい場合は(「bash」とマークしているため、そうでない可能性が高い)、次のものを使用する必要があります。

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

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

&また、ステートメントの最後にそれを使用したくない場合は、シェルはコマンドが完了するのを待たないようにします。特に、ある人が他の人に依存している場合は、さらにそうです。findにあるため、コマンドが失敗する可能性がありますmkdir

答え2

ファイル名に日付を挿入する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 ソルバーを使用します。 「今日」という新しい変数を作成します。 date コマンドを実行し、Y、m、d、H、M、S フラグを渡して出力を設定します。結果を日付変数に入れます。

filenameという新しい変数を作成し、$today変数を残りの静的ファイル名テキストで囲みます。これにより、ファイル名が画面に表示されます。

追加されたlulzのためにこれを1行に入れます:

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

答え3

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

set today = 'date +%Y'tcsh構文と似ていますが、tcshでも文字列をdate +%Y変数に割り当てますtodayが、コマンドを実行しませんdate。おそらくbashや他のPOSIXシェルを使用しているので、割り当て構文は次のとおりですtoday=some_value(等号の周りにスペースはありません)。コマンドを実行してその出力を変数に割り当てるには、次のようにします。コマンドの置き換え:

today=$(date +%Y-%m-%d)

(日付指定も完了しました。)ドル括弧の代わりにバックティックを使用することができますが、前の引用符と視覚的に簡単に混同することができ、バックティックコマンド内で引用符を使用する必要がある場合の規則は複雑で実装によって異なります。最良です$(…)(より通常の文法を使用すると同じ効果があります)。

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

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はそれより速くなる可能性があります)。

答え4

これ:

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

動作する必要があります。私はあなたがcshを使っているようですが、私は+記号を削除する私の解決策がうまくいかないかもしれませんが、試してみるのは悪くありません。偶発的な変数拡張を避けるために、常に変数を{}中括弧で囲むことをお勧めします。

関連情報