cpioを使用してディレクトリを再帰的にコピーする方法は?

cpioを使用してディレクトリを再帰的にコピーする方法は?

リストのディレクトリを再帰的にコピーする方法はmy-files-to-copy.txt

cd my/source/dir
cpio --create < my-files-to-copy.txt | (cd my/dest/dir && cpio --extract)
コピーしたいファイル.txt
src/main.js
src/routes/index.js
src/my-app/ # a directory with it's own child tree I want to recursively copy

答え1

cpioリストファイルを「前処理」する方法でディレクトリパス名を検出し、それを繰り返してその下のすべてのファイルのパス名を抽出する追加のスクリプトを実行しない限り、実際にこれを行う方法はありません。

次のような他のツールを使用する方がはるかに簡単です(rsync後で追加情報を参照してください!)。-r--files-from

rsync -a --files-from=my-files-to-copy.txt -r my/source/dir my/dest/dir

...またはpax標準ユーティリティ):

( cd my/source/dir && pax -w ) <my-files-to-copy.txt |
( cd my/dest/dir   && pax -r )

...またはpaxターゲットディレクトリの絶対パスを提供できる場合:

( cd my/source/dir && pax -rw /my/dest/dir ) <my-files-to-copy.txt

...またはBSD tar(GNUを使用-Tまたは--files-from=置換):-Itar

tar -c -f - -C my/source/dir -I my-files-to-copy.txt |
tar -x -f - -C my/dest/dir

これらすべてがmy-files-to-copy.txt現在のディレクトリにあると仮定し、そのディレクトリはそのディレクトリとは異なる場合がありますmy/source/dir

答え2

前のコメントで述べたように、cpio欲しいものをサポートしてください。たとえば、次のようになります。

find src/main.js src/routes/index.js src/my-app/ | cpio -pdm my/dest/dir

このアプローチの欠点は、速度を上げないように2つのプロセスを実行する必要があることです。これはすべてのファイルがfind必要で、しばらくするとすべてのファイルも必要になり、実際の作業を実行するために1つのプロセスしか使用されないためです。ライオン。stat(2)cpiostat(2)cpio

...または私のツールを使用して最も効率的な方法で行うことができますstar(最も古い無料のtarの実装)。

star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir

starこれは、プロセス内で使用するときにファイルごとに一度だけ呼び出すことができ、ファイルを読み取る基本プロセスと同時に新しいファイルを生成する2番目のプロセスを作成するため、効率的です。libfindstarstat(2)star

この方法の速度低下を避けるために、両方のstarプロセスは共有メモリを介してファイルの内容とファイルのメタデータを共有します。

注:もちろん、私の例のファイルのリストを次のように置き換えることができます。

` cat my-file-list.txt ` 

関連情報