リストのディレクトリを再帰的にコピーする方法は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=
置換):-I
tar
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)
cpio
stat(2)
cpio
...または私のツールを使用して最も効率的な方法で行うことができますstar
(最も古い無料のtarの実装)。
star -copy -p -find src/main.js src/routes/index.js src/my-app/ my/dest/dir
star
これは、プロセス内で使用するときにファイルごとに一度だけ呼び出すことができ、ファイルを読み取る基本プロセスと同時に新しいファイルを生成する2番目のプロセスを作成するため、効率的です。libfind
star
stat(2)
star
この方法の速度低下を避けるために、両方のstar
プロセスは共有メモリを介してファイルの内容とファイルのメタデータを共有します。
注:もちろん、私の例のファイルのリストを次のように置き換えることができます。
` cat my-file-list.txt `