ディレクトリ1のコンテンツをディレクトリ2にコピーしたいのですが、ディレクトリ1から(ディレクトリではなく)ファイルのみをコピーしたいのですが、どうすればよいですか?
cp dir1/* dir2/*
その後、まだディレクトリの問題があります。
また、すべての私のファイルには、任意の拡張子を持っていません。トリックをしません
cp dir1/* dir2
またはcp -t dir2 dir1/*
ディレクトリ1のコンテンツをディレクトリ2にコピーしたいのですが、ディレクトリ1から(ディレクトリではなく)ファイルのみをコピーしたいのですが、どうすればよいですか?
cp dir1/* dir2/*
その後、まだディレクトリの問題があります。
また、すべての私のファイルには、任意の拡張子を持っていません。トリックをしません
cp dir1/* dir2
またはcp -t dir2 dir1/*
回答:
cp dir1/* dir2
cp
明示的に指示されない限り(--recursive
たとえば、を参照man cp
)、ディレクトリをコピーしません。
注1: cp
ほとんどの場合、0以外のステータスで終了しますが、ファイルはとにかくコピーされます。終了コードに基づいてコマンドを連鎖とき、これは問題になる可能性があります&&
、||
、if cp -r dir1/* dir2; then ...
、など(のおかげcontrebisのためのその問題の自身のコメント)
注2:cp
最後のパラメータは単一のファイル名またはディレクトリであると想定しています。実際には*
、ターゲットディレクトリの名前の後にワイルドカードがあってはなりません。dir2\*
のようにシェルによって展開されdir1\*
ます。予期しないことが起こります:
dir2
、空とシェルとの設定に応じて、次のとおりです。
dir2/*
実際に存在し*
ない限り、文字どおりに(と名付けられたファイル/ディレクトリを探して)取得されますが、これもおそらくエラーにつながり*
ます。dir2/*
コマンドから完全に削除され、そのままになりcp dir1/*
ます。の展開によっては、dir1/*
データが破壊されることさえあります。
dir1/*
1つのファイルまたはディレクトリにのみ一致する場合、からエラーが発生しcp
ます。dir1/*
正確に2つのファイルに一致する場合、一方が他方によって上書きされます(Bad)。dir/*
マッチ複数のファイルと最後のマッチがある、あなたは、エラーメッセージが表示されます。dir/*
ディレクトリの場合、他のすべての一致がそのディレクトリに移動されます。dir2
空ではない、それは再び異なります。
dir2/*
ディレクトリである場合dir1/*
、他のの一致dir2/*
が移動されます。dir2/*
ファイルの場合、1つのファイルだけに一致しない限り 、おそらくエラーメッセージが表示されdir1/*
ます。$ cp dir1/* dir2
-> cp: dir1/isadir is a directory (not copied).
ステータス1で終了します。
cp
一致するファイルをコピーしますdir1/*
:Arch Linux、Ubuntu 14.04、OpenBSD 3.9および5.5、SuSE Linux 8.1、FreeBSD 6.2、Solaris 8、9および10(cp
実際にはコード2で終了します)。したがって、この動作は新しいものではなく(SuSE 8.1は2002年のものです)、Linuxに限定されているわけでもありません。指示されたすべてをcp
実行できなかったため、ゼロ以外の終了コードで終了します。それは何もしないという意味ではありません。
&&
問題が発生する可能性があるので、注目に値すると思いました。私はこのようなことをしようとしていましたが、状況を思い出せません。
*
隠しファイルを含めるかどうか、または隠しファイルを含める方法は、シェルによって異なります。*
に隠しファイルが含まれていない場合は、それらをと照合できます.*
。これが含まれることに注意してください.
と..
上bash
とdash
ではなく上zsh
。この回答のコンテキストではcp dir1/* dir1/.* dir2
、.
および..
はディレクトリであり、コピーされないため、問題はありません。zsh
で隠しファイルを含めることもできます*(D)
。
ワイルドカードを展開するのは、コマンドではなくシェルです。したがって、cp dir1/* dir2/*
最初に2つのワイルドカードを展開し、次にcp
結果を呼び出します。これは、あなたが明らかに期待していることとはまったく異なります。既に存在するファイルの数によってはdir2
、dir2/*
1つ以上の引数に展開される場合があります。コマンドcp
は、その引数のどれが最初のパターンの展開から来たのか、どの引数が2番目のパターンの展開から来たのかを知りません。最後の引数が宛先ディレクトリの名前であると想定しています。したがって、ディレクトリからディレクトリdir1
にすべてのファイルをコピーするにはdir2
、最後の引数がディレクトリである必要がありますdir2
。
cp dir1/* dir2
*
すべてのファイルに一致するため、すべてのファイルcp
をコピーしようとします。これにはディレクトリも含まれます。ディレクトリもファイルです。ディレクトリをスキップしますが、エラーを報告します。名前付きパイプなどの特別なファイルの内容をコピーします(何かを書き込んだり、cp
ブロックしたりする必要があります)など。
通常のファイルのみをコピーするには、一致を制限する必要があります。zshでは、そのためにglob修飾子 .
を使用できます。
cp dir1/*(.) dir2
他のシェルにはこれがありません。find
コマンドを使用して、ファイルタイプでフィルタリングできます。組み込みでないLinuxまたはCygwinを実行していると仮定します。
find dir1 -maxdepth 1 -type f -exec cp -t dir2 {} +
Linux、FreeBSD、OSXの場合:
find dir1 -maxdepth 1 -type f | xargs -I {} cp {} dir2
-maxdepth 1
。また、宛先ディレクトリの元のディレクトリ階層を再帰的にコピーして保持する方法はありますか?
-maxdepth 1
では、find
コマンドはサブディレクトリに再帰しますが、ここでは望ましくありません。サブディレクトリを含むディレクトリツリー全体をコピーする場合、それは完全に異なる質問であり、答えははるかに簡単ですcp -a dir1 dir2
。