1つのディレクトリから既存のディレクトリにファイルをコピーする


248

bashではこれを行う必要があります:

  1. ディレクトリ内のすべてのファイルを取得する

  2. それらを既存のディレクトリにコピーする

どうすればよいですか?私は試しましたcp -r t1 t2(t1とt2の両方が既存のディレクトリであり、t1にはファイルが含まれています)が、t2内にt1という名前のディレクトリが作成されました。どうすればよいですか?


11
なぜこれが閉じられたのですか?bashコマンドが組み込みコマンドであるか外部コマンドであるか(たとえば、printfはほとんどのシステムで両方に存在する)は任意なので、cp質問はbashプログラミング言語である質問と見なすことができます。ファイルのコピーについて話しているPythonの質問が閉じられるのを見たことがありません。
Ciro Santilli郝海东冠状病六四事件法轮功


Bashシェルコピーコマンドの構文についての注意を求めて到着しました。これらのコマンドが、Windowsインストールの基になるNTFSファイルシステムに対しても機能しているようだと報告できてうれしいです。
デビッドA.グレイ

回答:


396

あなたが欲しいのは:

cp -R t1/. t2/

末尾のドットは、ディレクトリ自体ではなく、現在のディレクトリの内容をコピーするように指示します。この方法には、隠しファイルとフォルダーも含まれます。


2
私はこの構文が本当に好きですが、何らかの理由でで動作しませんmv。なぜ誰か知っていますか?
Martin von Wittich、2013

2
すごい。これはどこに文書化されていますか?それはPOSIXまたは拡張ですか?
Ciro Santilli郝海东冠状病六四事件法轮功

9
@CiroSantilli六四事件法轮功包卓轩ディレクトリをコピーすると、cpはディレクトリを作成し、そこにすべてのファイルをコピーします。「。」と呼ばれるふりをするフォルダを使用する場合、それを保持するディレクトリと同じですが、コピーはこのように動作します。t1に「file」というファイルが含まれているとしましょう。cpは、「cp t1 /./ file t2 /./」と同等の操作を実行します。フォルダ「。」をコピーしていますが、ファイルをt2の「。」にコピーしています。「t2 /./」は「t2 /」と同じであるため、フォルダは「./」を取り除きます。技術的には、これはそれがPOSIXの組み込み動作であることを意味します...
印象的な

35

あるディレクトリから現在のディレクトリに何かをコピーしたい場合は、次のようにします。

cp dir1/* .

これは、隠しファイルをコピーしようとしていないことを前提としています。


20
隠しファイルがありません。
Ciro Santilli郝海东冠状病六四事件法轮功

1
多数のファイル(..「*」無限に多くのファイルを展開しませできませんので)yについても、失敗した
moritzschaefer

32
cp dir1/* dir2

または、dir1内にもコピーしたいディレクトリがある場合

cp -r dir1/* dir2

3
シェルの設定によっては、隠しファイルもキャッチしたい場合は、「dir1 / *」の代わりに「dir1 / * dir1 /.*」を使用する必要があるでしょう。
ssokolow

2
コピーは、dir1/.*そのコピーDIR1 / ..(あなたが実際にコピーしようとしているディレクトリのつまり親)として、良いアイデアではありません。また、dir1 /もコピーします。これは問題ありませんが、すでに(ほとんど)コピーされているので、作業を2回行うことになります。
Gordon Davisson

1
dir1/.*/ hiddenファイルの問題を回避するには、コピー元のディレクトリにcd-ingし、それをとして参照し.ます。だから、あなたは、既存のディレクトリへのディレクトリから隠しファイルを含むすべてのファイルをコピーしたい場合は、次のことができますcd [source dir]cp . [path to destination dir, with no trailing slash]
RobW 2012

8

t1がファイルを含むフォルダーであり、t2が空のディレクトリであると仮定します。あなたが望むのはこのようなものです:

sudo cp -R t1/* t2/

最初の例では、t1とt2は絶対パスまたは(現在の場所に基づく)相対パスでなければならないことに注意してください。必要に応じて、空のフォルダ(t2)に移動してこれを行うことができます。

sudo cp -R t1/* ./

または、ファイル(t1)のあるフォルダーに移動して、次のように実行できます。

sudo cp -R ./* t2/

注:*記号(またはワイルドカード)は、すべてのファイルとフォルダーを表します。-Rフラグは再帰的に(すべての中のすべてのもの)を意味します。


2
cp -R t1/ t2

ソースディレクトリの末尾のスラッシュはセマンティクスをわずかに変更するため、内容はコピーしますがディレクトリ自体はコピーしません。また、Bertrandの回答にあるグロビングと不可視ファイルの問題も回避します(コピーすると不可視ファイルが欠落し、t1/*`t1 / * t1 /.* 'をコピーするとt1 /。とt1 / ..は不要になります)。


あなたの解決策は、少なくともではない(12.10 Ubuntuの)私のインストールではなく、仕事をする $ mkdir t1 $ mkdir t2 $ touch t1/one $ touch t1/two $ touch t1/.three $ cp -R t1/ t2 $ ls t2/ t1 (コメントで申し訳ありませんがないcodeformat、で読めるバージョンpastebin.com/yszSxV6G
zpon

2

詳細によっては、次のようなことを行う必要がある場合があります。

r=$(pwd)
case "$TARG" in
    /*) p=$r;;
    *) p="";;
    esac
cd "$SRC" && cp -r . "$p/$TARG"
cd "$r"

...これは基本的にSRCディレクトリに変わり、それをターゲットにコピーしてから、開始した場所に戻ります。

追加の大騒ぎは、相対または絶対ターゲットを処理することです。

(これは、cpコマンド自体の微妙なセマンティクスに依存しません...末尾の/の有無にかかわらず、ソース仕様をどのように処理するかについて...それらが安定していて、移植性があり、GNU cpおよび将来もそうなるかどうかはわかりません)。


1

一部のディレクトリ内では、「folder1」からすべてのコンテンツを一部のディレクトリ内の新しいディレクトリ「folder2」にコピーするため、これは完全に使用されます。

$(pwd)は現在のディレクトリのパスを取得します。

folder1内のすべてのコンテンツを取得するために、folder1の後にドット(。)があることに注意してください。

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