私は次のようなものがあります:
- 2016-02-10_03-52.log
- 2016-02-10_04-43.log
- 2016-02-10_02-13.log
- ...
- 2016-03-15_07-03.log
- 2016-03-15_09-08.log
デフォルトでは、パターンはYYYY-MM-DD_.logです。
同じパターンで始まるすべてのファイルのtarを生成したいと思います。たとえば、次のようになります。
- 2016-02-10.tar
- ...
- 2016-03-15.tar
問題は、事前にパターンを知らず、構造だけを知っていることです。
同じ(不明な)パターンで始まるファイルを検索する方法がわかりません。
どんな助けでも大変感謝します。ありがとう
以下の「名目動物」ソリューションに基づいています。
エクスポート LANG=C LC_ALL=C 検索 - 名前'[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][ 0 -9]* '-printf '%f \ n' |。$||g'|Sort|UNIQLO|NAME を読んだときに実際に見つかりました。 - 名前 "${NAME}_-printf '%p\n' | tar -cJf "${NAME}.xz" -T - --no-unquote 完了
答え1
これは非常に簡単な2段階のプロセスです。
まず、find
最終的にアーカイブする必要があるすべてのファイルのリストを生成するために使用されます。sed
それぞれのアーカイブ名を生成するために使用されます。sort
出力を調べてフィルタリングして、必要uniq
なすべてのアーカイブの名前があることを確認してください。たとえば、
find . -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_*' -printf '%f\n' | sed -e 's|_.*$||g' | sort | uniq
上記の形式を使用して、%f
フルパスではなくファイル名のみを取得します。
次に、小さなbashループを介して各アーカイブ名を読み取り、find
それを再利用してすべてのログファイルを見つけて、そのリストをtar
アーカイブにパイプします。
これらのコマンドを実行するには、C / POSIXロケールを使用する必要があります(ローカライズされたエラーメッセージやその他の形式は使用しません)。環境変数LANG
をに設定するだけLC_ALL
ですC
。だから私が使用する完全なコマンドシーケンスは次のとおりです。
export LANG=C LC_ALL=C
find . -name '[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]_*' -printf '%f\n' | sed -e 's|_.*$||g' | sort | uniq | while read NAME ; do
find . -name "${NAME}_*.log" -printf '%p\n' | tar -cJf "${NAME}.tar.xz" -T - --no-unquote
done
-J
のパラメータは-cJf
XZ圧縮を参照します(高速でよく、おそらく本当に欲しいでしょう)。私は-cJf
「XZアーカイブファイルの生成」を読むのが好きです。-T -
これは、各アーカイブのファイルが標準入力で提供されることを意味し、--no-unquote
ファイル名が参照なしで生であることを意味します。
アーカイブ名のパターンはここでグローブするのに適しています。 (つまり、に供給できますfind -name ...
。)パターンに、*
またはが?
含まれている場合は、それをエスケープする必要があります。うまくいきますが迷惑です。 OPはファイル名パターンを非常によく選択したようです。[
]
答え2
tar
「追加」オプション()があることを考慮すると、-r
これを非常に簡単に保つことができます。
for file in *.log; do tar -rf "${file%%_*}.tar" "$file" ; done
z
この特定の方法()を使用してログを圧縮するオプションを含めることはできませんが、tar: Cannot update compressed archives
簡単です。
もちろん、必要に応じてワイルドカードパターンに堅牢性を追加してください。このバージョンでは、次のように仮定します。みんな .log
ファイルは1つまたは別のアーカイブに圧縮する必要があります。