ファイルのコピーとタイムスタンプの追加

ファイルのコピーとタイムスタンプの追加

ファイルをコピーして名前にタイムスタンプを追加するスクリプトには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")

別の問題は、タイムスタンプコードを追加すると、ターゲット%r「PM」がディレクトリではないというエラーが発生することです。 12時間タイムスタンプを取得しようとしています。

答え1

問題の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)。すべてのファイル名にタイムスタンプを追加するもう1つの質問です。

選択したタイムスタンプ形式は悪い考えです。人が読みにくく、並べ替えが難しい。日付部分と時間部分を区別して、重要度の低い順序(年、月、日、時、分、秒)で部分をソートして、読みやすく整列しやすい形式を使用する必要があります。

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")"

答え2

ソースファイル名がtest1.txtの場合、このコピーステートメントはファイルをコピーし、日付と時刻のスタンプを現在のディレクトリのソースファイル名に関連付けます。

cp test1.txt{,.$(日付+%Y%m%d%H%m%s)}

他の人が提案したように、「%r」を使用して同じ書式文字列(「+」の後の部分)を使用できますが、+ rによって生成された時間書式は「HH:MM:SS AM | PM」であり、私はそうではありません。埋め込みスペースやコロンと同じです。

著者の表示:これは私が自分で作成したものではなく、どこかのコメント、関連のないトピックに関するコメントで見つかりました。

関連情報