コマンドラインを使用してファイルを複数のフォルダーにコピーする方法は?


67

私はtest.txt1つのコマンドでファイルを複数のディレクトリにコピーしようとしました:

cp ~/test.txt ~/folder1 ~/folder2

しかし、私は成功しませんでした。1つのコマンドでそれを行う方法はありますか?ファイルまたはフォルダを複数のディレクトリにコピーできますか?


簡単ではありません。あなたは効率的にフォルダの既存の複数のコピーを更新するための「rsyncを」に見てみたいことがあります
するThorbjörnRavnアンデルセン

3
少しbashスクリプトを学習してみてください。非常に役立つことができます:for dest in folder1 folder2; do cp ~/test.txt ~/"$dest"; done
Shahbaz

単一のコマンドではなく、ここでつまずく人を助けるかもしれません:cp ~/test.txt ~/folder1 && cp ~/test.txt ~/folder2
マヌヤルヴィネン

回答:


71

cp複数のソースからコピーできますが、複数の宛先にコピーすることはできません。詳細についてはman cp、を参照してください。

複数の宛先にコピー/保存できるのは、私が知っている唯一のbashコマンドですtee

次のようにケースで使用できます。

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt

tee入力は標準出力(stdout)にも書き込まれることに注意してください。そのため、これが望ましくない場合は/dev/null、次のように標準出力をリダイレクトすることで防止できます。

tee ~/folder1/test.txt ~/folder2/test.txt < ~/test.txt >/dev/null

10
賢い、それは不正行為です!:)
テルドン

5
+1、賢い!そして、あなたが使用している場合>/dev/null...ターミナルをめちゃくちゃせずに、あまりにもバイナリファイルで作品を
Rmano

1
あなたのための+1、あなたのいつもママ:)が、ディレクトリをコピーしたい場合はどうすればよいですか?
nux 14年

2
@nux ディレクトリの場合に-rオプションを使用することを忘れないでくださいcp
ラドゥRădeanu14年

4
@nux:teeとは異なりcp、そのモード、所有者、タイムスタンプを無視してコピーするだけで、ファイルの内容。ファイル名のf=text.txt; <~/$f tee ~/folder1/$f > ~/folder2/$f
重複

61

複数の場所へのコピーを実現する別の方法は、次のコマンドです。

find dir1 dir2 -exec cp file.txt {} \;

dir1またはdir2に、ファイルをコピーしたくないサブディレクトリがある場合は、-maxdepth 0オプションを追加し ます。

find dir1 dir2 -maxdepth 0 -exec cp file.txt {} \;

これは内のすべてのファイルを上書きすることに注意してくださいdir1dir2してfile.txt、それをコピーすることに加えて、年代内容。file.txtこれらのディレクトリ内の他のファイルに影響を与えずにコピーのみを行うには、ディレクトリでfindのみ動作するように指示します。

find dir1 dir2 -type d -exec cp file.txt {} \;

4
いい解決策!ティーよりも完璧だと思う。
ダナテラ14年

1
確かに、リダイレクトは関係なく、それはまだ1つのコマンドです。
シルヴァンピノー14年

2
@SylvainPineau実際には3つあります:1つはfind2回(この場合)cpです。それにはfind多くの時間が必要だと言うことではありません。
ラドゥラデアヌ14年

3
「コマンド」の定義が「exec」呼び出しである場合は、多分ですが、これは私の本では「1つのコマンド」です。
小次郎14年

2
私はこれに戻ってきますので、私は賛成票を投じるべきだと考えました:D
ジョナサン

31

コマンド

cp ~/test.txt ~/folder1 ~/folder2

2つのファイル(~/test.txtおよび ~/folder1)を宛先にコピーしようとしますfolder2。(そして~/folder2存在し、ディレクトリである場合、「ディレクトリの省略」警告が表示されます)。

ファイルの複数のコピーを作成する場合test.txtは、ループまたは複数のコマンドを使用する必要があります...

for i in ~/folder1 ~/folder2; do cp  ~/test.txt $i; done 

(...ファイル名にスペースが埋め込まれている場合は注意してください、引用符で囲む必要があります)。

ディレクトリ全体をコピーするには、-rオプションを使用する必要があります。

for i in ~/folder1 ~/folder2; do cp -r ~/folder3 $i; done

これにより~/folder1/folder3~/folder2/folder3すべてのファイルが作成されます。


1
合格した読者の場合:仕様によると、forループは複合コマンドです。したがって、これはまだ 1つのコマンドであり、質問のすべての要件を満たしています。
小次郎14年

@nux、私は修正に同意しません。1)2つの大文字が間違っている。私の意図はコマンドをフレーズにインターリーブすることでした。2)省略記号はスタイルの問題です。で自分のスタイルを聞かせて下さい。
Rmano

1
わかりました、ごめんなさい、私はそれが良く見えると思った。
nux

私のシステムで、それはのfolder1にFOLDER3内のすべて〜/ folder1の/ FOLDER3としてFOLDER3保存するのではなく、コピーdoes notの
alpha_989

23

ヘルプスクリプトを作成するかxargs、印刷機能(この場合はecho)を使用して作成できます。

echo firstDir secondDir | xargs -n 1 cp test

これによりcpテストファイルをパラメーターとして使用して、各ディレクトリが関数の引数として作成されます。


これはおそらく質問に対する最良の/最も直接的な答えです
ブライソンS.

7

長い検索の後、この作品もチャームのようです!

for dir in *; do [ -d "$dir" ] && cp /path/file.txt "$dir" ; done

これにより、file.txtがターミナルの現在の場所にあるすべてのディレクトリにコピーされます。

for dir in *; do [ -d "$dir" ] && cp -rf /path/folder "$dir" ; done

これにより、フォルダーがターミナルの現在の場所にあるすべてのサブディレクトリにコピーされます。

他の人にも役立つことを願っています。


ではzshfor i in *(/); ...すべてのサブディレクトリをループするために使用できるため、[ -d ...テストを回避できます。拡張グロビングは、私が気に入っている理由の1つですbash
Rmano

コマンドで再度コード
-nux

1
zsh、この回答の最初のコマンドは次のように単純化することができますfor dir in *(/); do cp /path/file.txt "$dir"; donezsh.sourceforge.net/Intro/intro_2.html
Rmano

5
あなたが任意のボーン派生シェルでテストを排除することができますfor dir in */;
ヘンクLangeveld

@nuxこれは本当にうまく機能し、コマンドは非常に簡単です。はるかに高く投票する必要があります!
-nukeguy

1

/ tmp / target /のすべてのディレクトリにあるファイルtest.txtをコピーしたい場合...

テスト環境を作成します。

mkdir /tmp/target
cd /tmp/target
mkdir -v {folder1,folder2,folder3}
touch test.txt

コピーしてください:

find * -maxdepth 0 -type d -exec cp -vi test.txt {} \;

0

の答えにバリエーションを与えると思った Sylvain Pineau

どこにdir1ありdir2、現在のディレクトリにありません。

find ./ -maxdepth 2 -type d -name dir1 -exec cp file.txt {} \;

ここでfindはdir12レベルの深さ-maxdepthを探すかdir1、パラメーターを省略して現在のディレクトリとその下のすべてのフォルダーを検索できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.