ls 出力を grepping するコマンドの置換によりエラーが発生する

ls 出力を grepping するコマンドの置換によりエラーが発生する

コマンド置換を使用して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日に最後に変更されたファイルのみを検索し、最新のファイルは見つかりません。-print0null文字()を使用して出力ファイルを分割し、各ファイルをインポートしてからファイルを一括追加する呼び出しを作成するようにfindに指示します。\0xargs -0tar

これはおそらく最もパフォーマンスの低い方法です。

メモ: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個の呼び出しが節約されます。findtar\+findtartar

引用する

答え3

現在の形式はls|grep "Aug 17"何も出力しません。代わりに、次の形式を使用してください。

$ ls -ltr  | grep 'Aug 17'

答え4

このawk行に$(ls -lrth|grep "Aug 17")必要な日付を抽出できます。

$(ls -lrth|awk '/Aug/&&/17{print $0}')

関連情報