コマンド置換を使用してtar.tgzファイルを作成しようとしています。
2012年8月17日のバックアップがあります。
-rw-r----- 1 ossec 502 804M Aug 17 2012 BKPMDISINT_i6nir20j.F_bkp
-rw-r----- 1 ossec 502 2.7G Aug 17 2012 BKPSYFINT_i5nir20j.F_bkp
-rw-r----- 1 ossec 502 3.9G Aug 17 2012 BKPMSFFINT_i4nir20j.F_bkp
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-00
-rw-r----- 1 ossec 502 2.0G Aug 17 2012 ALG_KLPFINT_ianir576.alg
-rw-r----- 1 ossec 502 1.5G Aug 17 2012 ALG_KLPFINT_i8nir576.alg
-rw-r----- 1 ossec 502 37M Aug 17 2012 ALG_KLPINT_ibnir64h.alg
-rw-r----- 1 ossec 502 2.2G Aug 17 2012 ALG_KLPFINT_i9nir576.alg
-rw-r----- 1 ossec 502 28M Aug 17 2012 c-651746692-20120817-01
-rw-r----- 1 ossec 502 27M Aug 17 2012 ctrl_170803
だから私はそれらをタールする必要があります。このコマンドを使用しました
tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "8月17日")
しかし、私にはこのようなエラーが発生します。
tar: You may not specify more than one `-Acdtrux' option
Try `tar --help' or `tar --usage' for more information.
答え1
これにより、$(ls -lrth|grep "Aug 17")
ファイル名だけでなく行全体が引数として取得されるため、tar
機能しません。一般的に言えば解析されない出力ls
。
比較的新しいバージョンのGnu find(> = v4.3.3)がある場合は、次のことができます。
find . -maxdepth 1 -newermt 20120817T0000 -not -newermt 20130818T0000 -print0 \
| cpio --create --null --format=ustar \
| gzip > DB-Backup-17082012.tgz
find
これをサポートしていない場合は、-newermt
これらの日付タイムスタンプを使用して2つのファイルを作成し、-newerを使用できます。もちろんそれも使用できますが、-daystart -mtime
日付を計算する必要があります(または試行錯誤を使用する必要があります)。
私が提案する1つは、ファイルの日付をYYYYMMDD形式で使用することです。まず、同じ文字列(日付基準)で始まる複数のファイルがある場合は、2番目にファイル名(6月5日(ヨーロッパ)または5月6日(アメリカ))を見ている人に応じてソートが良くなります。 05062012はあいまいです。 。したがって、1708年は8月17日に間違いありませんが、DB-Backup-20120817.tgz
答え2
あなたの道
必要に応じて行うことができますが、一部のファイルの名前にスペースがある可能性があるため、危険です。しかし、これは一つのアプローチです。
$ tar -zcvf DB-Backup-17082012.tgz $(ls -lrth|grep "Aug 17"|awk '{print $9}')
これにより、得られた他のすべての列データが削除され、ls -lrth
ファイル名のみが提供されます。
find & tar を使用: 方法 #1
Unixfind
コマンドを使用して、特定の日付に最後に変更されたすべてのファイルのリストを取得し、そのリストを次にtar
パイプすることができます。
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 -print0 | \
xargs -0 tar zcvf DB-Backup-17082012.tgz
上記のコマンドは、2012年8月17日に最後に変更されたファイルのみを検索し、最新のファイルは見つかりません。-print0
null文字()を使用して出力ファイルを分割し、各ファイルをインポートしてからファイルを一括追加する呼び出しを作成するようにfindに指示します。\0
xargs -0
tar
これはおそらく最もパフォーマンスの低い方法です。
メモ:tar
また、この方法では、コマンドライン引数としてコマンドに渡すことができるよりも多くのファイルがあると、ファイルが失われる危険性があります。
find & tar を使用: 方法 #2
-print0
重複するので、これをxargs -0
使用してfind
リストを作成してtar
直接呼び出すことができます。
$ find . -type f -newermt 2012-08-17 ! -newermt 2012-08-18 \
-exec tar zcvf DB-Backup-17082012.tgz {} \+
{} \+
上記のfindパラメータは2つのことを行います。は、呼び出されたときにこの場所にある各ファイルの名前を置き換え{}
、呼び出し前にコマンドラインからできるだけ多くのファイルを追加し続けるように指示されます。コマンドラインに追加するファイルが100個ある場合、100個の呼び出しが節約されます。find
tar
\+
find
tar
tar
引用する
答え3
現在の形式はls|grep "Aug 17"
何も出力しません。代わりに、次の形式を使用してください。
$ ls -ltr | grep 'Aug 17'
答え4
このawk行に$(ls -lrth|grep "Aug 17")
必要な日付を抽出できます。
$(ls -lrth|awk '/Aug/&&/17{print $0}')