同じパターンで始まるTarファイル

同じパターンで始まるTarファイル

私は次のようなものがあります:

  • 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のパラメータは-cJfXZ圧縮を参照します(高速でよく、おそらく本当に欲しいでしょう)。私は-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つまたは別のアーカイブに圧縮する必要があります。

関連情報