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


12

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

cp dir1/* dir2/*

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

また、すべての私のファイルには、任意の拡張子を持っていませんトリックをしません


1
拡張機能がそれとどう関係するのか分からない。
ctrl-alt-delor 2013年

1
cp dir1/* dir2またはcp -t dir2 dir1/*
ctrl-alt-delor 2013年

@richard DOSの世界では、ディレクトリに拡張機能を使用しないというかなり一般的な習慣がありますが、それでもある程度は存続しており、ドットがある場合はディレクトリではない、またはその逆であると考える人もいます。
Gilles 'SO-悪をやめなさい' 11/11/20

わかりましたが、まだ関係はありません。
ctrl-alt-delor 2013年

回答:


18
cp dir1/* dir2

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

注1: cpほとんどの場合、0以外のステータスで終了しますが、ファイルはとにかくコピーされます。終了コードに基づいてコマンドを連鎖とき、これは問題になる可能性があります&&||if cp -r dir1/* dir2; then ...、など(のおかげcontrebisのためのその問題の自身のコメント

注2cp最後のパラメータは単一のファイル名またはディレクトリであると想定しています。実際には*、ターゲットディレクトリの名前の後にワイルドカードがあってはなりません。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で終了します。
contrebis 2016

1
はい、私にとってもステータス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実行できなかったため、ゼロ以外の終了コードで終了します。それは何もしないという意味ではありませ
Adaephon 2016

3
確かに、これと一緒にコマンドをチェーンしていると&&問題が発生する可能性があるので、注目に値すると思いました。私はこのようなことをしようとしていましたが、状況を思い出せません。
contrebis 2016

これは隠しファイルをコピーしません。
felwithe

@felwithe *隠しファイルを含めるかどうか、または隠しファイルを含める方法は、シェルによって異なります。*に隠しファイルが含まれていない場合は、それらをと照合できます.*。これが含まれることに注意してください...bashdashではなく上zsh。この回答のコンテキストではcp dir1/* dir1/.* dir2.および..はディレクトリであり、コピーされないため、問題はありません。zshで隠しファイルを含めることもできます*(D)
Adaephon

6

ワイルドカードを展開するのは、コマンドではなくシェルです。したがって、cp dir1/* dir2/*最初に2つのワイルドカードを展開し、次にcp結果を呼び出します。これは、あなたが明らかに期待していることとはまったく異なります。既に存在するファイルの数によってはdir2dir2/*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。また、宛先ディレクトリの元のディレクトリ階層を再帰的にコピーして保持する方法はありますか?
Abdull

@Abdullなし-maxdepth 1では、findコマンドはサブディレクトリに再帰しますが、ここでは望ましくありません。サブディレクトリを含むディレクトリツリー全体をコピーする場合、それは完全に異なる質問であり、答えははるかに簡単ですcp -a dir1 dir2
Gilles「SO-悪をやめる」

0

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

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

    $ cp fileName destination directory path

例:

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