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


70

ファイルのバックアップを作成する必要がありますが、名前の一部としてタイムスタンプを付けて、区別しやすくしたいと思います。

現在の日付をコピーコマンドにどのように挿入しますか?

[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

回答:


109

コマンド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

日付と時刻の出力に関するその他のフォーマットコードについては、日付のマニュアルページを参照してください

追加の形式

manページを参照して完全に制御したい場合は、次のようなことができます。

$ 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

1
+1-日付には常に「%Y%m%d-%H%M%S」または「%y%m%d-%H%M%S」の形式指定子を使用します。
ChuckCottrill

ただ、touch foo`date +%F`また正常に動作します。
ヴァジム

警告:これはcshシェルでは機能しません
Govinda Sakhare

1
@GovindaSakhare-csh / tcshは、サブシェル表記を。の...代わりにbackticks()に切り替え$(..)ます。Cシェルは、サブシェルの表記法をサポートしていないようです。
slm

date +"%Y-%m-%d"はと同じdate -Iです。とにかくiso形式を推奨します。パラメータに時間、分、秒、またはnsを追加することにより、精度を指定できます-I。例date -Iseconds
ティルシェーファー

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

最後の1つは私にcpを与えました:ターゲット `foo..backup.20160913-134158 'はディレクトリではありません
Kalpesh Soni

@KalpeshSoni私が投稿した正確なコマンドでは、このエラーメッセージを生成できません。別のコマンドを使用している必要があります。
ジル

10

冗長な日付を本当に使用する場合は、バックティックを保護する必要があります。この日付形式では、引用符で囲まない限り(または他の方法でエスケープしない限り)、スペースが埋め込まれ、Unixシェルではno-noになります。

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

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

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

5

関数を使用すると、あなたの人生が楽になります。これは私が使用するものです:

backup () { 
    for file in "$@"; do
        local new=${file}.$(date '+%Y%m%d')
        while [[ -f $new ]]; do
            new+="~";
        done;
        printf "copying '%s' to '%s'\n" "$file" "$new";
        \cp -ip "$file" "$new";
    done
}

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です。


RHELの日付マニュアルに--iso-8601スイッチが表示されないため、ここにリンクを配置します。GNU日付オプション:
イヴァンチャウ

3

タイムスタンプが付加された名前で作成されたバックアップファイルにファイルをコピーします

cp foo.txt backup_`date +"%d-%m-%Y"`.txt

または:

「cat」を使用してファイルのコンテンツを表示し、タイムスタンプを追加して名前が作成されたバックアップファイルに出力をリダイレクトできます。

cat foo.txt > backup_`date +"%d-%m-%Y"`.txt

必要に応じて、より多くのFORMATコントロールオプションを使用することもできます(例:%H、%M、%Sなど)。


catリダイレクションの利点は何cpですか?
グイド

それはそうするだけの代替方法です
アトゥールRokade

2

ファイルのバックアップを作成しなければならないとき、私は通常この方法でそれをします。

cp foo.txt foo.backup.$(date +%F).txt

ls -l

foo.txt foo.backup.2017-9-19.txt


1
これは、他の回答がまだ提起していないことを追加しません。さらに、%F日付形式は2桁の月を生成し、ls -l通常は単なるファイル名よりもわずかに多くの情報を提供します。
クサラナナンダ

1

bashでは、次のように入力できます。

cp /path/to/long/filename !#$_$(date +Is)

展開されるもの:

cp /path/to/long/filename /path/to/long/filename_$(date +Is)

その結果:

$ ls /path/to/long/filename*
filename  filename_2017-05-10T11:50:10+0300

ビーフビーイングdate -Is。覚えやすく、入力しやすく、短いバージョンを使用できるので(-In精度がおかしい場合など)、使用するのが好きです。


! イベント指定子を開始します。

 !#     The entire command line typed so far.

そして$、単語指定子です:

   $      The last word.  This is usually the last argument, but will expand to the zeroth word if there is only one word in the line.

0

ファイルまたはディレクトリのバックアップだけが必要な場合は、宛先も入力する必要があります。シェル拡張を使用して、コピーファイル名の最後に日付を追加します。

すなわち

cp filename.sh{,."`date`"}

結果として

filename.sh.Sun 29 Sep 00:44:43 BST 2019

または単に使用する

cp filename{,.20190929}

filename.sh.20190929

日付を追加して、ニーズに合わせます。:)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.