バックアップファイル名に日付を追加する方法

バックアップファイル名に日付を追加する方法

ファイルをバックアップする必要がありますが、簡単に区別できるように、タイムスタンプを名前の一部として含めたいと思います。

コピーコマンドに現在の日付を挿入するには?

[root@mongo-test3 ~]# cp foo.txt {,.backup.`date`}
cp: target `2013}' is not a directory

[root@mongo-test3 ~]# cp foo.txt {,.backup. $((date)) }
cp: target `}' is not a directory  

[root@mongo-test3 ~]# cp foo.txt foo.backup.`date`
cp: target `2013' is not a directory

答え1

dateコマンドはスペースを含む文字列を返すため、これは機能しません。

$ date
Wed Oct 16 19:20:51 EDT 2013

本当にこのようなファイル名が必要な場合は、文字列を引用符で囲む必要があります。

$ touch "foo.backup.$(date)"

$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:22 foo.backup.Wed Oct 16 19:22:29 EDT 2013

しかし、私の考えでは、別の文字列を追加することを検討することもできます。私は通常、次のようなものを使用します。

$ touch "foo.backup.$(date +%F_%R)"
$ ll foo*
-rw-rw-r-- 1 saml saml 0 Oct 16 19:25 foo.backup.2013-10-16_19:25

より日付マニュアルページ日付と時刻を出力するための追加の書式設定コード。

追加フォーマット

すべての権限が必要な場合は、マニュアルページを参照して次のことができます。

$ date +"%Y%m%d"
20131016

$ date +"%Y-%m-%d"
2013-10-16

$ date +"%Y%m%d_%H%M%S"
20131016_193655

メモ:date -Iまたは を使ってdate --iso-8601と同じ出力を生成できますdate +"%Y-%m-%d。スイッチはまた取ることができますさまざまな時間形式を表すパラメータ:

$ date -I=?
date: invalid argument ‘=?’ for ‘--iso-8601’
Valid arguments are:
  - ‘hours’
  - ‘minutes’
  - ‘date’
  - ‘seconds’
  - ‘ns’
Try 'date --help' for more information.

例:

$ date -Ihours
2019-10-25T01+0000

$ date -Iminutes
2019-10-25T01:21+0000

$ date -Iseconds
2019-10-25T01:21:33+0000

答え2

cp foo.txt {,.backup.`date`}

これはそのようなものに拡張されますcp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013。中かっこの前のスペースは新しい単語を始めます。

cp foo.txt {,.backup. $((date)) }

中かっこは別の単語なので、文字通り解釈されます。さらに、$((…))算術拡張の構文はdate算術式の構文とはまったく異なります。コマンド置換では、括弧セットを使用します$(date)

cp foo.txt foo.backup.`date`

もっと近い。これを中括弧で表すことができますcp foo.{txt,.backup.`date`}。出力にスペースが含まれる問題がまだあるため、二重引用date符で囲む必要があります。これは働きます:

cp foo.{txt,backup."`date`"}

または

cp foo.{txt,backup."$(date)"}

デフォルトの出力形式はdateファイル名には適していないため、/ロケールがデフォルトの出力形式の文字を使用しても機能しない可能性があります。ファイル名のアルファベット順が時系列になるようにYMD日付形式を使用します(また、米国日付形式と国際日付形式の間のあいまいさを避けるため)。

cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}

答え3

本当に詳細な日付を使用するには、バックティックを保護する必要があります。この日付形式の欠点は、スペースが含まれていることです。スペースは、引用符で囲まない限り(または別の方法でエスケープしない限り)Unixシェルでは許可されません。

cp foo.txt "foo-`date`.txt"

しかし、私はより短いISO形式を使用することを好みます。

cp foo.txt foo-`date --iso`.txt

答え4

デフォルトでは、出力にスペースがあるため、date前のコマンドは失敗しました。最後のパラメータを引用すると"機能します。他の試みは構文エラーです。

空白なしで考えられる解決策は次のとおりです。

cp foo.txt foo.backup.$(date --iso-8601=seconds)  

または

cp foo.txt foo.backup.`date --iso-8601=seconds`

追加すると

bk() {
     cp -a "$1" "${1}_$(date --iso-8601=seconds)"
}

あなたに.bashrcもう一度ログインするか、bashにそれをもう一度読んでもらいますbk file.txt。 。

関連情報