アーカイブに含める絶対パスのリストを含むファイルを生成することによって生成されたcpioアーカイブがあります。 (通常のテキストファイルの1行に1つの絶対パス)アーカイブを生成するコマンドは、デフォルトで次のようになります。
cat list-of-files | cpio -ocvB > preserved.cpio
後でこのアーカイブからファイルを抽出する必要があります。今回も抽出するファイルのリストを含むファイルを使用しようとしています(アーカイブ内のすべてのファイルの一部のサブセット、もう一度行に1つの絶対パスを持つプレーンテキストファイル形式)。
cpio -icuBdmv `cat files-to-extract` < preserved.cpio
この方法は、パスの1つにスペースが含まれていない場合は正しく機能します。アーカイブを作成するのは良いことですが、ファイルを抽出すると、名前にスペースが含まれているファイルは自動的にスキップされます。他のすべてのパスはfiles-to-extract
正常に抽出されました。
この問題を解決する方法を見つけるためにコンソールでゲームをプレイしましたが、何も役に立ちませんでした。名前にスペースを含む単一のファイルを指定して引用符で囲むと、ファイルは正常に抽出されます。
# This extracts the file successfully
cpio -icuBdmv "/foo/bar/some file.txt" < preserved.cpio
したがって、files-to-extract
ループから読み取って各ファイルを一度に1つずつ抽出できますが、これらのアーカイブは容量が大きく(数GB)非常に遅くなる可能性があります。
ファイルパスからスペースをエスケープしたり、各パス値を引用したりするためにいくつかの試みをしましたが、何も機能しませんでした。
# Still skips the file with spaces:
cpio -icuBdmv `cat files-to-extract | sed 's/ /\\ /'` < preserved.cpio
# Extracts no files, even the ones without spaces:
cpio -icuBdmv `cat files-to-extract | sed 's/\(.*\)/"\1"/'` < preserved.cpio
一度に1つのファイルを繰り返し抽出するのではなく、単一のcpio実行でこの抽出を実行できることをお勧めします。私はこれがcpioにこれらの値を与える方法に問題があるだけだと確信していますが、生涯の間にその理由を知ることはできません。
関連性がないかもしれませんが、完全性のためです。これはCentOS 7.2でGNU cpio 2.11を使用することです。
ベストアンサー1
cpio
コマンドラインにファイル名を指定する代わりに(または同時に)ファイルからファイル名のリストを読み取る-E
()オプションがあります。--pattern-file
たとえば、
cpio -icuBdmv -E files-to-extract < preserved.cpio
cpio
-F
(stdin / stdoutを使用する代わりに)アーカイブ名も指定する必要があります。-I
と似ています-O
が、それぞれstdinまたはstdoutの代わりに動作します。
たとえば、アーカイブを指定し、-F
標準入力にファイルのリストを提供できます。
cpio -icuBdmv -F preserved.cpio < files-to-extract
または両方を使用-E
して-F
cpio -icuBdmv -E files-to-extract -F preserved.cpio
ちなみに、多くのGNUプログラム(GNUを含むcpio
)の場合、マニュアルページはほとんど役に立ちませんが、.infoファイルによく文書化されています。一部のLinuxディストリビューションでは、情報文書は通常別々のパッケージ(debianなど)cpio-doc
なので、情報リーダー(GNUinfo
またはpinfo
cpio
とにかく、情報ページから抜粋した関連内容は次のとおりです。
-E FILE
、--pattern-file=FILE
FILEから抽出またはリストするファイル名を指定する別のパターンを読み取ります。 FILE行は、cpioのオプションではなくパラメータとして扱われます。このオプションはコピーモードで使用されます。
そして
-F ARCHIVE
、--file=ARCHIVE
標準入力または出力の代わりに使用するアーカイブファイルの名前。別のコンピュータのテープドライブをアーカイブとして使用するには、HOSTNAMEで始まるファイル名を使用します
HOSTNAME:
。ここで、HOSTNAMEはコンピュータの名前またはIPアドレスです。@
権限(通常はそのユーザーファイルのエントリ)がある場合は、~/.rhosts
ホスト名の前にユーザー名と、そのユーザーとしてリモートテープドライブにアクセスするために使用されるユーザー名が続くことがあります。