tarを使用したls結果の圧縮

tarを使用したls結果の圧縮

特定の月ごとにログファイルを圧縮したいと思います。すべてのファイルを一覧表示するには、次のコマンドを使用します。

ll | grep 'Sep' | grep 'oim_server'

その後、結果をtarで圧縮する必要があります。どうすればいいですか?

答え1

9月に修正されたすべてのファイルを探す:

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01

アーカイブにファイルを添付する:

tar -rvf archive.tar filename

ここでexecを使用して2つを組み合わせます。

find . -type f -newermt 2016-09-01 ! -newermt 2016-10-01 -exec tar -rvf logs_sept.tar {} +

答え2

特定の年の9月に最後に変更され、名前に次のものを含む隠しファイル(ディレクトリを含むすべてのタイプ)を保持する場合は、ファイルはユーザーに関連付けられますが、oim_serverこれはコマンドの意図と同じです。ll | grep 'Sep' | grep 'oim_server'/グループ/一致)ファイル名/記号リンクターゲットには、Sepまたはoim_server)が含まれています。 GNUシステムでは、次のことができます。

find . -mindepth 1 -maxdepth 1 ! -name '.*' \
       -name '*oim_server*' -printf '%Tm:%p\0' |
  sed -zn 's/^09://p' |
  tar --null --no-recursion -T - -cvvf - |
  xz > file.tar.xz

--no-recursionいいえまた、9月に内容が最後に変更されたディレクトリも保持します。

圧縮せずにアーカイブのみを行うことに注意してくださいtar(後でそのまま復元できるように、データとメタデータを含むファイルをテープまたはファイルに収集します)。出力を上記のコンプレッサーにパイプしてxz圧縮アーカイブを取得できます。 GNUのようないくつかのtar実装では、tarこれらのコンプレッサー自体を呼び出すことができます(-J/ は最新バージョンのGNUで圧縮に使用されます--xz)。xztar

フィルタ処理された出力に表示されるファイルをアーカイブするには、ls次の手順を実行できます。

ll | grep Sep | grep oim_server |
  awk '{print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz

これは次のように単純化できます。

ll | awk '/Sep/ && /oim_server/ {print $NF}' |
  tar  --no-recursion -T - -cvvf - |
  xz > file.tar.xz

しかし、ここには多くの制限があります。

  • 月フィールドだけでなく、行全体を検索しますgrep SepSepこれには、ユーザーとグループ名、ファイル名、シンボリックリンクの宛先が含まれます。
  • Sep9月に最後に変更されたファイルの場合は、一部の英語ロケールでのみ使用できます。
  • Sep上記と同様に、オンラインoim_serverでどこでも見つけることができます。
  • ファイル名には改行文字を含めることができるため、通常、ファイル名が1行だけを占めると仮定するのは間違いです。
  • さらに悪いことは、awk '{print $NF}'各行の最後の単語が印刷されることです。つまり、スペースを含むファイル名やシンボリックリンクでは機能しません(シンボリックリンクターゲットの最後の単語が出力されます)。

関連情報