web-dev-qa-db-ja.com

あるディレクトリから別のディレクトリに通常のファイルのみをコピーする

ディレクトリ1のコンテンツをディレクトリ2にコピーしたいのですが、ディレクトリ1から(ディレクトリではなく)ファイルのみをコピーしたいのですが、どうすればよいですか?

cp dir1/* dir2/*

その後、まだディレクトリの問題があります。

また、すべてのファイルには拡張子が付いていないため、ではうまくいきません

12
user1058398
cp dir1/* dir2

明示的に指示されない限り、cpはディレクトリをコピーしません(たとえば、--recursiveを使用すると、man cpを参照してください)。

注1:cpはゼロ以外のステータスで終了する可能性が高いですが、ファイルはとにかくコピーされています。これは、終了コードに基づいてコマンドをチェーンするときに問題になる可能性があります:&&||if cp -r dir1/* dir2; then ...など( contrebis のおかげで その問題に関するコメント

注2cpは、最後のパラメータが単一のファイル名またはディレクトリであることを想定しています。実際には、ターゲットディレクトリの名前の後にワイルドカード*があってはなりません。 dir2\*は、dir1\*と同様にシェルによって展開されます。予期しないことが起こります

  • dir2が空で、シェルと設定に応じて:
    • エラーメッセージが表示される場合がありますが、これは最良のシナリオです。
    • dir2/*は文字どおりに使用され(*という名前のファイル/ディレクトリを探します)、*が実際に存在しない限り、これもエラーになる可能性があります。
    • dir2/*コマンドから完全に削除され、cp dir1/*が残ります。 dir1/*の展開によっては、データが破壊されることもあります。
      • dir1/*が1つのファイルまたはディレクトリのみに一致する場合、cpからエラーが発生します。
      • dir1/*が正確に2つのファイルと一致する場合、一方が他方によって上書きされます(Bad)。
      • dir/*が複数のファイルと一致し、最後の一致がaの場合、エラーメッセージが表示されます。
      • dir/*の最後の一致がディレクトリである場合、他のすべての一致がそこに移動されます。
  • dir2が空でない場合、それは再び依存します:
    • dir2/*の最後の一致がディレクトリである場合、dir1/*およびdir2/*の他の一致が移動されます。
    • dir2/*の最後の一致がファイルの場合、おそらくエラーメッセージが表示されますunlessdir1/*は1つのファイルのみに一致します。
18
Adaephon

ワイルドカードを展開するのはシェルであり、コマンドではありません。したがって、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

以下は、コピー元からコピー先のディレクトリにファイルをコピーするコマンドです。

  1. ソースフォルダに移動し、以下のコマンドを書きます:

    $ cp fileName destination directory path

例:

cp publichOT.sh  /data/home/useradmin
0
Tapan Dubey