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

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

1番ディレクトリの内容を2番ディレクトリにコピーしたいです。しかし、ディレクトリではなくディレクトリ1からファイルをコピーしたいだけです。どうすればいいですか?

cp dir1/* dir2/*

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

また、私のファイルには拡張子がないので*.*動作しません。

答え1

cp dir1/* dir2

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

注1: cpゼロ以外の状態で終了する可能性が高いが、ファイルはとにかくコピーされます。これは、終了コード(&&など)に基づいてコマンドをリンクするときに問題になる可能性があります。 (ありがとうございます||if cp -r dir1/* dir2; then ...コンテビス~のためこの問題について彼らが言ったこと)

ノート2cp最後の引数は単一のファイル名またはディレクトリであると予想されます。*ターゲットディレクトリ名の後にはワイルドカード文字を含めないでください。 .予期しないことdir2\*のように、シェルによって拡張されます。dir1\*〜する起こる:

  • 空で、dir2シェルと設定によって異なります。
    • 最良のシナリオであるエラーメッセージのみが表示されることがあります。
    • dir2/*文字通り使用され(名前付きファイル/ディレクトリの検索)、実際に存在しない限り*エラーが発生する可能性があります。*
    • dir2/*cp dir1/*拡張子によってはコマンドから完全に削除され、dir1/*データが破損する可能性があります。
      • dir1/*ファイルまたはディレクトリが1つだけ一致すると、エラーが発生しますcp
      • 正確に2つのファイルが一致すると、dir1/*あるファイルが別のファイルで上書きされます(悪い)。
      • dir/*複数のファイルが一致し、最後の一致がaの場合、エラーメッセージが表示されます。
      • 最後の一致がdir/*ディレクトリの場合、他のすべての一致はそのディレクトリに移動されます。
  • 空でない場合は、dir2次のように変わります。
    • 最後の一致がdir2/*ディレクトリの場合、dir1/*他の一致はdir2/*中に移動されます。
    • 最後の一致がdir2/*ファイルの場合、エラーメッセージが表示されることがあります。〜しない限り dir1/*1つのファイルのみが一致します。

答え2

コマンドではなくワイルドカードを拡張するのはシェルです。したがって、cp dir1/* dir2/*まず2つのワイルドカードを展開してからcp結果を呼び出します。これは予想したものとまったく異なります。dir2にすでに存在するファイルの数に応じて、dir2/*1つ以上のパラメータに拡張できます。このコマンドは、cp最初のモードを拡張してインポートされたパラメーターと2番目のモードを拡張してインポートされたパラメーターを知りません。最後のパラメータはターゲットディレクトリの名前になると予想されます。したがって、ディレクトリ内のすべてのファイルをdir1ディレクトリにコピーするには、dir2最後のパラメータがディレクトリである必要がありますdir2

cp dir1/* dir2

*すべてのファイルが一致するため、cpすべてのファイルをコピーしようとします。これにはディレクトリが含まれます。ディレクトリもファイルです。ディレクトリをスキップしますが、エラーを報告します。名前付きパイプ(何かを記録しておく方が良いです。そうしないとブロックされますcp)などの特殊ファイルの内容をコピーします。

コピーのみ可能定期的なファイルの場合は、一致を制限する必要があります。 zshでは利用可能ですグローバル予選 .その理由は次のとおりです。

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

答え3

「cp」の代わりに「rsync」を使用できます。

rsync -vt dir1/* dir2/

よりきれいで、場合によってはより速いです。

答え4

以下は、ソースディレクトリからターゲットディレクトリにファイルをコピーするコマンドです。

  1. ソースフォルダに移動して、次のコマンドを作成します。

    $ cp fileName destination directory path

例:

cp publichOT.sh  /data/home/useradmin

関連情報