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


13

ファイルをコピーし、名前にタイムスタンプを追加するスクリプトに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時間制として取得しようとしています。


AM / PMを追加すると、ファイル名に余分なスペースが追加されます。cp -ra / home / bpacheco / Test1 "/ home / bpacheco / Test2-$(date +%m-%d-%y-%r)"
Romeo Ninov

2
またはdate +"%m-%d-%y-%I:%M:%S_%p"
don_crissti

回答:


12

問題の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##*/} 展開します(パターンに一致する最長のプレフィックスを削除します):source/*/

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

Test1がディレクトリである場合、それは再帰的にコピーされ、ディレクトリ内のファイルは名前を保持します。トップレベルのディレクトリのみにタイムスタンプが追加されます(たとえばTest1/foo、にコピーされますTest1-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")"

ジル、最初のコマンドは私見では機能しません。二重引用符の位置を確認してください。質問への私のコメントを参照してください
ロミオニノフ

@RomeoNinov最初のコマンドの何が問題になっていますか?実行してエラーが発生しましたか?
ジル 'SO-悪であるのをやめる'

あなたは正しい、dateコマンドはサブシェルで実行されている
ロミオNinov

Gilles、上記の例を使用して、上記のタイムスタンプ情報を含むファイルを別のディレクトリにコピーする方法を教えてください。次のコマンドは機能しませんcp -a /home/bpacheco/Test1/Test{,"-$(date +"%m-%d-%y-%r")"} /home/bpacheco/Test2
ブライアン

@ブライアンあなたのコメントを理解したかどうかはわかりませんが、私の編集を見てください。
ジル 'SO-悪であるのをやめる'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.