web-dev-qa-db-ja.com

ファイルをコピーしてタイムスタンプを追加する

ファイルをコピーして名前にタイムスタンプを追加するスクリプトには2つの問題があります。

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%T")

上記はファイル名としてTest2を追加していますが、この例ではTestという名前の元のソースファイルのファイル名を保持したいと思います。

cp -ra /home/bpacheco/Test1 /home/bpacheco/Test2-$(date +"%m-%d-%y-%r")

もう1つの問題は、タイムスタンプコードとして%rを追加すると、ターゲット "PM"がディレクトリではないというエラーが表示されることです。タイムスタンプを12時間の時刻として取得しようとしています。

13
Brian

問題の1つは、コマンド置換の前後の二重引用符を省略したため、dateコマンドの出力がスペースで分割されていたことです。参照 なぜ私のシェルスクリプトは空白や他の特殊文字を詰まらせるのですか? これは有効なコマンドです:

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%m-%d-%y-%r")"

元のファイル名に追加する場合は、変数に含める必要があります。

source=/home/bpacheco/Test1
cp -a -- "$source" "$source-$(date +"%m-%d-%y-%r")"

Bashを使用している場合は、代わりにブレース展開を使用できます。

cp -a /home/bpacheco/Test1{,"-$(date +"%m-%d-%y-%r")"}

ファイルを別のディレクトリにコピーし、タイムスタンプを元のファイル名に追加する場合は、次のようにすることができます— ${source##*/}expands の値にsource最後までの部分なし/(パターン*/に一致する最長のプレフィックスを削除します):

source=/home/bpacheco/Test1
cp -a -- "$source" "/destination/directory/${source##*/}-$(date +"%m-%d-%y-%r")"

Test1がディレクトリの場合、ディレクトリは再帰的にコピーされ、ディレクトリ内のファイルは名前を保持します。トップレベルディレクトリのみにタイムスタンプが付加されます(例:Test1/fooTest1-05-10-15-07:19:42 PMにコピーされます)。すべてのファイル名にタイムスタンプを追加したい場合、それは別の問題です。

タイムスタンプ形式の選択は悪い考えです。人間にとっては読みにくく、並べ替えも困難です。読みやすく、並べ替えが簡単な形式を使用する必要があります。つまり、年、月、日、時、分、秒のように重要度の高い順にパーツを並べ、日付部分と時間部分を分離します。

cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y%m%d-%H%M%S")"
cp -a /home/bpacheco/Test1 "/home/bpacheco/Test2-$(date +"%Y-%m-%dT%H%M%S%:z")"