"zip"プログラムには、ユーザーがディレクトリツリー内の特定の名前のすべてのファイルを圧縮できるようにする-R機能があります。zip -rv/s zip -R
たとえば、
zip -R bigfile "bigfile"
以下をすべて圧縮します
。./bigfile
./a/bigfile
./a/b/bigfile
./a/b/c/bigfile
....
ただし、-R機能はgzipまたはxzにはないようです。私はこれを試して、マニュアルページも確認しました。
それでは、gzipとxzでこの動作をどのようにシミュレートしますか?
答え1
ユーティリティの組み合わせfind
とtar
圧縮:
そしてgzip
:
find . -type f -name bigfile | tar cfz bigfile.tgz -T -
または次のようにxz
:
find . -type f -name bigfile | tar cfJ bigfile.txz -T -
find
現在/作業ディレクトリ内のすべてのファイルを再帰的に検索し、bigfile
結果のパス名を指定してtar
タールボールを作成して圧縮します。
このコマンドは、質問で提供された例に適合します。で提供されているさまざまなモードには、zip -R
で提供されている対応するパラメータが必要ですfind
。
また、これが可能なすべてのファイル名に対して機能しないことに注意してください。 --nullオプションを考慮し、find -print0でtarを指定する必要があります。
また、tar
「-T」オプションは、すべてのシステム(HP-UXなど)で使用できるわけではありません。
編集1
たとえば、zip、rar、または7-zipとは異なり、gzipとxzは複数のファイルを単一のファイルに圧縮できません。
gzipのマニュアルページを引用すると、次のようになります。
後で独立して抽出できるように、複数のメンバーを含む単一のアーカイブファイルを作成するには、tarやzipなどのアーカイブプログラムを使用します。 GNU tar は gzip を透過的に呼び出す -z オプションをサポートしています。 gzipはtarに代わるものではなく、補完するように設計されています。
バラより複数のファイルを1つのgzファイルに圧縮するには?そして複数のファイルを.xzアーカイブに圧縮するには?。
編集2
OPの目標が検索基準を満たすすべてのファイルに対してgzipファイルを生成することである場合は、次のコマンドを実行する必要があります。
find . -type f -name bigfile | gzip > bigfile.gz
xzファイルの場合:
find . -type f -name bigfile | xz > bigfile.xz
検索基準を満たす各ファイルに対して同じディレクトリに圧縮ファイルを作成し、元のファイルを「未変更」のままにします。
編集3
提案通り@クサラナンダ、bash
初めて行う場合:
shopt -s globstar
次に、次のコマンドを実行します。
tar -c -zf bigfile.tgz ./**/bigfile
検索基準に一致するサブディレクトリ内の複数のファイルを使用してアーカイブファイルが作成されます。
検索基準を満たすサブディレクトリ内のすべてのファイルに対して圧縮ファイルを生成することが目標である場合は、コマンドを実行してからshopt
次のように実行します。
gzip ./**/bigfile