見つかったファイルのリストをxargs gzipにパイプし、もう一度Pigzにパイプします。

見つかったファイルのリストをxargs gzipにパイプし、もう一度Pigzにパイプします。

x日以降のファイルを見つけてgzipに変換する必要がありますが、 pigz を使って実行したいと思います。

今私はこれをゆっくりしています。

find /path/to/src -type f -mtime -90 | xargs tar -zcf archive.tar.gz

しかしpigz、はるかに高速なので、Pigzを使ってこのgzipを実行したいと思います。私はこれを試しましたが、うまくいきません。

find /path/to/src -type f -mtime -90 | xargs tar -zcf | pigz > archive.tar.gz

何をすべきかを推測していくつか試してみたので、エラーが返されます。

tar (child): /path/to/src: Cannot open: Is a directory
tar (child): Error is not recoverable: exiting now

最初の有効な行を取得してPigzにパイプするにはどうすればよいですか?

答え1

サポートされているすべてのシェルでGNU tarを使用するプロセスの交換(例:bash、ksh、zsh):

tar cf archive.tar.gz -I pigz --null -T <(find /path/to/src  -type f -mtime -90 -print0)

これは、圧縮を実行したり、オプションとプロセスオーバーライドの出力pigzから、またはアーカイブに含めるファイルの(NULで区切られた)リストを取得するために使用されます。find ... -print0-T--files-from=FILE

または、POSIX機能(ashまたはダッシュ、環境変数セット/bin/shとして実行されるbashなど)のみを持つミニマリストシェルを使用している場合は、NULで区切られたファイル名のリストをGNU tarにパイプすることもできます。次のオプションは、tarにstdinからファイルのリストを読み込むように指示します。--posixset -o posixPOSIXLY_CORRECT--T

find /path/to/src  -type f -mtime -90 -print0 | tar cf archive.tar.gz -I pigz --null -T -

どちらも有効なファイル名、スペース、改行、およびシェルメタ文字を含むファイル名でも機能します。また、@Kusalanandaが自分の意見で述べたファイル名があまりにも多くの問題を回避します。

ちなみに、使用したいかもしれませんピクセル変えるpigz。もちろんxz圧縮(通常はgzipより優れていますが遅い)、pixzがtarに似た入力を検出すると、インデックスを追加して特定のファイルの抽出を高速化します。ちなみに、どちらも最も一般的なLinuxディストリビューション用にパッケージされているpixzのでxz-utils、インストールは簡単です。

答え2

GNUまたはlibarchiveを想定すると、次のようになりますtar

find /path/to/src -type f -mtime -90 -print0 |
  tar -cf - --no-recursion --null -T - |
  pigz > archive.tar.gz

(報告されたファイルタイプではない--no-recursionため、これは必ずしも必要ではありません。find目次)。

複数実行できるため、使用しないでください(andを使用している場合にのみ出力で動作しますxargs)。これにより、最後のバッチのみを含むアーカイブが作成されます。find-0find-print0tar

tarここではファイルのリストを直接パイプするため、-T -この方法でパイプできるファイルの数に制限はありません。これはまた、tarファイルが見つかるとすぐにアーカイブを開始できることを意味します。

star@ヒリー(RIP)tar)には、次の機能も組み込まれていますfind

star cf - -find /path/to/src -type f -mtime -90 |
  pigz > archive.tar.gz

しかし、上記の他の2つの構文と同じアプローチを使用することもできます。

find /path/to/src -type f -mtime -90 -print0 |
  star cf - -read0 list=- |
  pigz > archive.tar.gz

tar移植性が非常に低いコマンドです。 tar形式でもSポータブルではありません。X / Open / SUSv2はtarコマンドを指定するために使用されます。(そしてcpio)しかし、異なるサプライヤーのsを調和させることは不可能だったので、結局これを放棄し、tar代わりにPOSIX / SUSがpax両方の代替品として提案されました。

paxstdinからファイルのリストを取得しますが、残念ながらNULで区切られず、改行で区切られます。つまり、一部のpax実装では拡張子をサポートしていますが-0find'も-print0POSIXではありませんが置換可能です-exec printf '%s\0' {} +)、任意のファイル名を保持できません。したがって、次のようにします。

find /path/to/src -type f -mtime -90 -print0 |
  pax -0w |
  pigz > archive.tar.gz

(すべてのPOSIXはデフォルトの出力フォーマットを定義しないことに注意してください。これはもう1つの弱点です。pax最大の弱点は採用率が非常に低いことです。)

関連情報