ディレクトリ1のコンテンツをディレクトリ2にコピーしたいのですが、ディレクトリ1から(ディレクトリではなく)ファイルのみをコピーしたいのですが、どうすればよいですか?
cp dir1/* dir2/*
その後、まだディレクトリの問題があります。
また、すべてのファイルには拡張子が付いていないため、。ではうまくいきません
cp dir1/* dir2
明示的に指示されない限り、cp
はディレクトリをコピーしません(たとえば、--recursive
を使用すると、man cp
を参照してください)。
注1:cp
はゼロ以外のステータスで終了する可能性が高いですが、ファイルはとにかくコピーされています。これは、終了コードに基づいてコマンドをチェーンするときに問題になる可能性があります:&&
、||
、if cp -r dir1/* dir2; then ...
など( contrebis のおかげで その問題に関するコメント )
注2:cp
は、最後のパラメータが単一のファイル名またはディレクトリであることを想定しています。実際には、ターゲットディレクトリの名前の後にワイルドカード*
があってはなりません。 dir2\*
は、dir1\*
と同様にシェルによって展開されます。予期しないことが起こります:
dir2
が空で、シェルと設定に応じて:dir2/*
は文字どおりに使用され(*
という名前のファイル/ディレクトリを探します)、*
が実際に存在しない限り、これもエラーになる可能性があります。dir2/*
コマンドから完全に削除され、cp dir1/*
が残ります。 dir1/*
の展開によっては、データが破壊されることもあります。dir1/*
が1つのファイルまたはディレクトリのみに一致する場合、cp
からエラーが発生します。dir1/*
が正確に2つのファイルと一致する場合、一方が他方によって上書きされます(Bad)。dir/*
が複数のファイルと一致し、最後の一致がaの場合、エラーメッセージが表示されます。dir/*
の最後の一致がディレクトリである場合、他のすべての一致がそこに移動されます。dir2
が空でない場合、それは再び依存します:dir2/*
の最後の一致がディレクトリである場合、dir1/*
およびdir2/*
の他の一致が移動されます。dir2/*
の最後の一致がファイルの場合、おそらくエラーメッセージが表示されますunlessdir1/*
は1つのファイルのみに一致します。ワイルドカードを展開するのはシェルであり、コマンドではありません。したがって、cp dir1/* dir2/*
は最初に2つのワイルドカードを展開し、次に結果に対してcp
を呼び出します。これは、明らかに期待するものではありません。dir2
に既に存在するファイルの数によっては、dir2/*
が1つ以上の引数に展開される場合があります。コマンドcp
は、最初のパターンの展開からの引数と、2番目のパターンの展開からの引数を認識していません。最後の引数が宛先ディレクトリの名前であると想定しています。したがって、すべてのファイルをディレクトリdir1
からディレクトリdir2
にコピーするには、最後の引数はディレクトリdir2
である必要があります。
cp dir1/* dir2
*
はすべてのファイルに一致するため、cp
はすべてのファイルをコピーしようとします。これにはディレクトリも含まれます。ディレクトリもファイルです。ディレクトリをスキップしますが、エラーを報告します。名前付きパイプなどの特別なファイルの内容をコピーします(何かを書き込んでおくと、cp
でブロックされます)など。
regularファイルのみをコピーするには、一致を制限する必要があります。 zshでは、 glob qualifier.
を使用できます。
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
以下は、コピー元からコピー先のディレクトリにファイルをコピーするコマンドです。
ソースフォルダに移動し、以下のコマンドを書きます:
$ cp fileName destination directory path
例:
cp publichOT.sh /data/home/useradmin