cpioを使用して、1つ以上のパスにスペースを含めることができるファイルを抽出します。

cpioを使用して、1つ以上のパスにスペースを含めることができるファイルを抽出します。

アーカイブに含める絶対パスのリストを含むファイルを生成することによって生成された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ホスト名の前にユーザー名と、そのユーザーとしてリモートテープドライブにアクセスするために使用されるユーザー名が続くことがあります。

おすすめ記事