特定の月ごとにログファイルを圧縮したいと思います。すべてのファイルを一覧表示するには、次のコマンドを使用します。
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
)。xz
tar
フィルタ処理された出力に表示されるファイルをアーカイブするには、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 Sep
。Sep
これには、ユーザーとグループ名、ファイル名、シンボリックリンクの宛先が含まれます。 Sep
9月に最後に変更されたファイルの場合は、一部の英語ロケールでのみ使用できます。Sep
上記と同様に、オンラインoim_server
でどこでも見つけることができます。- ファイル名には改行文字を含めることができるため、通常、ファイル名が1行だけを占めると仮定するのは間違いです。
- さらに悪いことは、
awk '{print $NF}'
各行の最後の単語が印刷されることです。つまり、スペースを含むファイル名やシンボリックリンクでは機能しません(シンボリックリンクターゲットの最後の単語が出力されます)。