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からファイルのリストを読み込むように指示します。--posix
set -o posix
POSIXLY_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
-0
find
-print0
tar
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
両方の代替品として提案されました。
pax
stdinからファイルのリストを取得しますが、残念ながらNULで区切られず、改行で区切られます。つまり、一部のpax
実装では拡張子をサポートしていますが-0
(find
'も-print0
POSIXではありませんが置換可能です-exec printf '%s\0' {} +
)、任意のファイル名を保持できません。したがって、次のようにします。
find /path/to/src -type f -mtime -90 -print0 |
pax -0w |
pigz > archive.tar.gz
(すべてのPOSIXはデフォルトの出力フォーマットを定義しないことに注意してください。これはもう1つの弱点です。pax
最大の弱点は採用率が非常に低いことです。)