ファイルのバックアップを作成する必要があります。区別しやすくするために、名前の一部にタイムスタンプを付けたいです。
現在の日付をコピーコマンドにどのように挿入しますか?
[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
コマンド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
_cp foo.txt {,.backup.`date`}
_
これは_cp foo.txt .backup.Thu Oct 17 01:02:03 GMT 2013
_のように展開されます。中括弧の前のスペースは、新しいWordを開始します。
_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
のデフォルトの出力形式はファイル名に適しておらず、ロケールがデフォルトの出力形式で_/
_文字を使用している場合でも機能しない可能性があります。 Y-M-D日付形式を使用して、ファイル名の辞書式順序が時系列になるようにします(また、米国と国際日付形式のあいまいさを避けるためにも)。
_cp foo.{txt,backup."$(date +%Y%m%d-%H%M%S)"}
_
本当に詳細な日付を使用したい場合は、バックティックを保護する必要があります。この日付形式では、スペースが埋め込まれているため、引用符で囲む(または他の方法でエスケープする)場合を除き、Unix Shellではno-noになります。
cp foo.txt "foo-`date`.txt"
ただし、私はより短いISO形式を使用することを好みます。
cp foo.txt foo-`date --iso`.txt
関数を使用して、それはあなたの人生を容易にします。これは私が使用するものです:
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
}
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
を呼び出すだけです。
タイムスタンプが付加された名前のバックアップファイルにファイルをコピーします
cp foo.txt backup_`date +"%d-%m-%Y"`.txt
または:
「cat」を使用してファイルのコンテンツを表示し、タイムスタンプが付加された名前が作成されたバックアップファイルに出力をリダイレクトできます。
cat foo.txt > backup_`date +"%d-%m-%Y"`.txt
必要に応じて、より多くのFORMATコントロールオプションを使用することもできます(例:%H、%M、%Sなど)。
ファイルのバックアップを作成する必要がある場合、通常はこの方法で行います。
cp foo.txt foo.backup.$(date +%F).txt
ls -l
foo.txt foo.backup.2017-9-19.txt
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.
ファイルまたはディレクトリのバックアップだけが必要な場合は、宛先も入力する必要があるので、シェル拡張を使用して、コピーファイル名の末尾に日付を追加します。
つまり
cp filename.sh{,."`date`"}
その結果
filename.sh.Sun 29 Sep 00:44:43 BST 2019
または単に使用する
cp filename{,.20190929}
filename.sh.20190929
必要に応じて日付を追加してください。 :)