gnu cpコマンドを使用してファイルを複数のディレクトリにコピーする方法


210

cpコマンドを使用して単一のファイルを複数のディレクトリにコピーすることは可能ですか?

私は次のことを試しましたが、うまくいきませんでした:

cp file1 /foo/ /bar/
cp file1 {/foo/,/bar}

forループやfindを使用することは可能です。しかし、gnu cpコマンドを使用することは可能ですか?

回答:


106

いいえ、cp複数のソースをコピーできますが、単一の宛先にのみコピーします。cp目的に応じて、宛先ごとに1回ずつ、複数回呼び出すように調整する必要があります。あなたが言うように、ループや他のツールを使用します。


答えてくれてありがとう!もう少し考えてみると、余分なフラグ(存在しない)がないと、cpはソースとDESTディレクトリが何であるかを認識できません。
Tom Feiner、

10
これは正解ではありません。Robert Gambleの回答をご覧ください。
PlagueHammer 2013

23
@Nocturne:私が言ったことのどの部分が間違っていますか?Robertが提案するように、別のツールを使用してcpを複数回呼び出す例を示します。他のツールや構造を使用してそれを行うことを含む多くの可能な解決策がありますが、OPは彼がすでに可能であることを認識していたことを示しました。
moonshadow 2013

2
悲しいことに、cp(およびscp)がその機能をサポートすることは素晴らしいことです。それでも、ティーを使用して分割を行うことができます。superuser.com/questions/32630/...
サイモン

4
@moonshadow:もちろんあなたの答えは正しいです。PlagueHammerは、この文脈では他の答えがより有用であると言いたいと思います。おそらくあなたもあなたの答えにそのようなものを含めるかもしれませんか?
平和な

585

あなたがこれを行うことができないcpだけでなく、あなたは組み合わせることができますcpxargs

echo dir1 dir2 dir3 | xargs -n 1 cp file1

コピーするfile1にはdir1dir2dir3。 これを行うには3回xargs呼び出しcpますxargs。詳細については、manページを参照してください。



24
@サイモンどうやって?「cp一人でこれを行うことはできません」別の方法を提案することによって回答が役立つように試みたからといって、質問が回答されなかったわけではありません。
ニコール

3
@NickC指定された質問者:「forループまたはfindを使用してそれが可能であることを知っています。しかし、gnu cpコマンドを使用して可能ですか?」良い答えは受け入れられたものです。
Simon

25
技術的に質問に答えるかどうかに基づいて回答が受け入れられることを規定すると、知識が不十分になり、実際には役に立たなくなります。
バックギャモン

4
非常に役立ちます!私のような他の初心者のために:cpで正規表現を使用することはできませんが、このコマンドの最初の部分(たとえばecho dir[1-3] | xargs -n 1 cp filename)では使用できます。
Jason

77

ワイルドカードはRobertsコードでも機能します

echo ./fs*/* | xargs -n 1 cp test 

コメント全体...たとえば、デスクトップにあるルート所有のファイル(実際にはシンボリックリンク)をすべてのユーザーのデスクトップに移動するには、最初にsudo su(それ以外の場合は機能しません)を使用する必要がありました。 / * /デスクトップ/ | xargs -n 1 cp -av / home / myusername / Desktop / file。
デビッドG

19

私が見る限り、以下を使用できます:

ls | xargs -n 1 cp -i file.dat

コマンドの-iオプションはcp、現在のディレクトリのファイルをで上書きするかどうかを尋ねられることを意味しますfile.dat。完全に自動化されたソリューションではありませんが、私にとってはうまくいきました。


1
-iガードを追加したのは良いことですが、すべてのファイルを上書きすることについてプロンプトが表示されませんか?ディレクトリにコピーするのではなく?
ハリネズミ

1
@Hedgehogまあ、私はこのコマンドがディレクトリにファイルがあり、それをディレクトリのサブディレクトリにコピーしたいときに便利だと思います。この場合、ファイルは一度だけ上書きできます。ご質問ありがとうございます!
Evgeny

2
私にとっては、一連のcp: overwrite質問が出力されましたが、それらに答える必要はなく、ファイルを上書きすることもありませんでした。
Evgeni Sergeev 2014年

また、一連の質問を印刷し、末尾に「:」文字を付けてdirという名前のファイルにコピーしました。まったく解決策はなく、Paulの解決策は完全に機能しています
jgpATs2w

19

私は/superuser/32630/parallel-file-copy-from-single-source-to-multiple-targetsではなく、で見た回答を使用してcatそれにtee基づいています。cp

例えば:

cat inputfile | tee outfile1 outfile2 > /dev/null

1
私が実行したおおまかなテストでは、宛先が異なる物理ドライブ(デジタルフィルムのソースビデオのようなファイルベースの2つの物理コピーを保持する)である場合、これが最高のパフォーマンスを発揮します。
好奇心旺盛な2015年

1
あなたはbashの3.0以上を使用している場合は、次のように範囲を使用することができます:cat <inputfile> | tee /path-to-files/outfile{1..4} > /dev/null
サミュエル・

tee < inputfile outfile1 outfile2 > /dev/nullTayweeの回答が示すように、これも便利なパターンです。catからのパイピングが不要になるように、「<」でのio-redirectionの使用に注意してください。
Alex Telon

10

これらの答えはすべて、明白なものよりも複雑に見えます。

for i in /foo /bar; do cp "$file1" "$i"; done

エレガントで機能し、現在のディレクトリのすべてのディレクトリに対してそれを行うには、次のように使用できますfor d in */ ; do cp $file "$i" done
FantomX1

9

ls -db di*/subdir | xargs -n 1 cp File

-bディレクトリ名にスペースある場合はそれ以外の場合はxargsによって別のアイテムとして壊れますが、エコーバージョンにこの問題がありました。


6

それ自体はcpを使用していませんが、...

これは、(遅い)SDカードから3つの(遅い)USBドライブに多数のGoproフッテージをコピーする場合に思い付きました。時間がかかったので、一度だけデータを読みたかった。そして、私はそれを再帰的にほしかった。

$ tar cf - src | tee >( cd dest1 ; tar xf - ) >( cd dest2 ; tar xf - ) | ( cd dest3 ; tar xf - )

(さらに出力が必要な場合は、それらの>()セクションをさらに追加できます。)

ベンチマークはしていませんが、cp-in-a-loop(または多数の並列cp呼び出し)よりも明らかに高速です。


5

でコピー使用するにはxargsMac OSでワイルドカードを使用してディレクトリに、私のために働いた唯一のソリューション、ディレクトリ名にスペースがあります:

find ./fs*/* -type d -print0 | xargs -0 -n 1 cp test 

どこにtestコピーするファイルである
./fs*/*コピーへのディレクトリには、

問題はxargsのは、スペースが新しい引数として、ソリューションが使用して区切り文字を変更することが見ているということです-dか、-E残念ながら、正しくはMac OS上で動作していません。


4

フォークされたコマンドなしでそれをしたい場合:

tee <inputfile file2 file3 file4 ... >/dev/null


2

本質的にxargsの回答と同等ですが、並列実行が必要な場合:

parallel -q cp file1 ::: /foo/ /bar/

したがって、たとえば、file1を現在のフォルダー(再帰を含む)のすべてのサブディレクトリにコピーするには、次のようにします。

parallel -q cp file1 ::: `find -mindepth 1 -type d`

注意:これはおそらく、非常に特殊な使用例、たとえば各ターゲットディレクトリが個別のディスクである場合に、顕著な速度向上のみを伝えます。

また、xargsの「-P」引数と機能的に類似しています。


0

いいえ、あなたがすることはできません。

この機能を使用できることが何度かわかったので、これを行うための独自のツールを作成しました。

http://github.com/ddavison/branch

ものすごく単純 -
branch myfile dir1 dir2 dir3


私が自分でそのようなスクリプトを作成するシナリオはよくありますが、最近は非常に多くのマシンを使用する傾向があるため、それらをすべて同期させることは大きな手間と思われます。/eたとえば、各マシンで1回だけクラウドWebディレクトリをマウントする方法があった場合、私は自分のpowertoolsを記述してそれらを永久に保持することができました。
Evgeni Sergeev 2014年

0
ls -d */ | xargs -iA cp file.txt A

1
少し説明はどうですか?

これは実際に動作しますが、説明は偉大だったでしょう
Ælex

0

fileName.txt現在の作業ディレクトリ内のすべてのサブディレクトリにコピーするとします。

  1. すべてのサブディレクトリ名を取得lsして、一時ファイルに保存します。allFolders.txt

    ls > allFolders.txt
  2. リストを印刷して、それをcommandに渡しxargsます。

    cat allFolders.txt | xargs -n 1 cp fileName.txt

0

別の方法は、次のように猫とティーを使用することです:

cat <source file> | tee <destination file 1> | tee <destination file 2> [...] > <last destination file>

ただし、ジョブは複数のプロセス(宛先ごとに1つ)に分割され、ハードドライブはプラッターのさまざまな部分に複数のファイルを一度に書き込むため、これはかなり非効率的だと思います。ただし、ファイルを複数の異なるドライブに書き出す場合、この方法はおそらく非常に効率的です(すべてのコピーが同時に発生する可能性があるため)。


0

bashスクリプトの使用

DESTINATIONPATH[0]="xxx/yyy"
DESTINATIONPATH[1]="aaa/bbb"
                ..
DESTINATIONPATH[5]="MainLine/USER"
NumberOfDestinations=6

for (( i=0; i<NumberOfDestinations; i++))
    do
        cp  SourcePath/fileName.ext ${DESTINATIONPATH[$i]}

    done
exit

私はこれに反対票を与えました。質問は、非ループソリューションを具体的に求めました。
Alex Telon

-1

複数のフォルダに複数のフォルダをコピーしたい場合は、次のようにすることができます:

エコーdir1 dir2 dir3 | xargs -n 1 cp -r / path / toyourdir / {subdir1、subdir2、subdir3}


-1

すべてのターゲットディレクトリがパス式に一致する場合(それらがすべてのサブディレクトリであるなど)、次のように組み合わせてpath/to使用findcpます。

find ./path/to/* -type d -exec cp [file name] {} \;

それでおしまい。


私はこれに反対票を与えました。質問は特に非解決策を求めました。
Alex Telon

@AlexTelonを本当に徹底してくれてありがとう。私はそのビットを逃したと思います。私もあなたが一貫していてfind、スレッドで使用している他のすべての回答に反対票を投じたことを願っています。
Mig82

-2

ファイルをコピーするフォルダーを特定する必要がある場合は、findを1つ以上のgrepsと組み合わせることができます。たとえば、サブフォルダー内のfavicon.icoの出現箇所を置き換えるには、次のように使用できます。

find . | grep favicon\.ico | xargs -n 1 cp -f /root/favicon.ico

-3

これは直下のサブディレクトリにコピーされ-maxdepthます。さらに深くしたい場合は、パラメーターを調整します。

find . -mindepth 1 -maxdepth 1 -type d| xargs -n 1 cp -i index.html

すべてのディレクトリにコピーしたくない場合は、必要のないディレクトリをフィルターに掛けることができます。で始まるすべてのフォルダーにコピーする例 a

find . -mindepth 1 -maxdepth 1 -type d| grep \/a |xargs -n 1 cp -i index.html

ディレクトリの任意の/ばらばらのセットにコピーする場合は、Robert Gambleの提案が必要になります。


-3

ファイルを複数のディレクトリにcp file1 /foo/; cp file1 /bar/; cp file1 /foo2/; cp file1 /bar2/ コピーしたい: ディレクトリを他のディレクトリにコピーする: cp -r dir1/ /foo/; cp -r dir1/ /bar/; cp -r dir1/ /foo2/; cp -r dir1/ /bar2/

これはいくつかのコマンドを発行するようなものですが、1行入力してしばらく離れたい場合に適しています。


7
あなたは他の15の答えで6年前の質問に答えています。あなたの答えはかなり斬新である必要があります。私の意見-そうではありません。
クレイグS.アンダーソン

-4

たとえば、宛先フォルダの親ディレクトリにいる場合は、次のことができます。

$(ls);のi cp sourcefile $ iを実行します。終わった


質問はforループで可能であると言っているので、これは実際には何も追加しません。
LJNielsenDk 2013年

反対投票。の出力を解析しようとしないでくださいls。常に変数を引用してください。 for i in ./*; do cp sourcefile "$i"; done
sleblanc 2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.