LPIC-1 PDFを読んでいます。それは言う:
通常、ディレクトリの内容全体をコピーするには、次のようにします。
cp -r ソースパス/* ターゲットパス
しかし、*がない -rオプション自体だけでは十分ではない理由を理解できません。そうなんですか?
ありがとうございます。
編集:私はそれを試してみましたが、結果は面白かったです。まず、ターゲットが存在しない場合、ソースのワイルドカード*は、ターゲットディレクトリがないためにエラーを発生させます。 *cpが存在しない場合は、トップレベルディレクトリとサブディレクトリに隠されたファイルを含むすべての隠しファイルがコピーされます。
一方、ターゲットが存在し、ソースで*ワイルドカードを使用している場合、cpは一番上のすべてのファイル(隠しファイルを除く)をコピーしますが、サブディレクトリの隠しファイルも含めます。
[rocky@rocky ~]$ tree -a test1
test1
├── .hiddentestfile1
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 4 files
[rocky@rocky ~]$ cp -r test1/* newdest
cp: target 'newdest' is not a directory
[rocky@rocky ~]$ cp -r test1/ newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── .hiddentestfile1
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 4 files
[rocky@rocky ~]$ rm -r newdest
[rocky@rocky ~]$ mkdir newdest
[rocky@rocky ~]$ cp -r test1/* newdest
[rocky@rocky ~]$ tree -a newdest
newdest
├── test2
│ ├── .hiddentestfile2
│ └── testfile2
└── testfile1
1 directory, 3 files
答え1
cp -r SOURCE_PATH/* DEST_PATH
各(非表示)ファイルまたはディレクトリとその内容をDEST_PATHに繰り返しコピーします(これがディレクトリまたはディレクトリへのシンボリックリンクであると仮定します)。
その後、SOURCE_PATHに、とがfile
含まれている場合はsumで終わります。dir
.git
DEST_PATH/file
DEST_PATH/dir
DEST_PATH
存在しない場合、またはディレクトリではなく、SOURCE_PATH
非表示になっているファイルまたはディレクトリ(たとえば)のみが含まれている場合、そのディレクトリSOURCE_PATH/file
はコピーされずにコピーされますcp -r SOURCE_PATH/file DEST_PATH
。これは、DEST_PATHのコピーが作成されることを意味します(または上書き)file
。コマンドがDEST_PATHに追加された場合、/
これは発生しません(コピーまたは失敗の保証)。ディレクトリではありません-t
; GNUオプションも参照してくださいcp
。
そして:
cp -r SOURCE_PATH DEST_PATH
SOURCE_PATHディレクトリ(隠しファイルを含む内容を繰り返し含む)をDEST_PATHにコピーすると(もう一度ディレクトリが存在し、ディレクトリであると仮定)、終了しますDEST_PATH/SOURCE_PATH
。DEST_PATH/SOURCE_PATH/{.git,dir,file}
したがって、全く異なる結果が表示されます。
ここにすべてコピーコンテンツSOURCE_PATH(隠しファイルを含む)SOURCE_PATH自体をDEST_PATHに入れる代わりに、以下を使用することをお勧めします。
cp -r SOURCE_PATH/. DEST_PATH
隠しファイルも含めることに加えて(zshを想定するとそのファイルも使用できますcp -r SOURCE_PATH/*(D) DEST_PATH/
)、次の場合に失敗しないという利点があります。あまりにも議論するSOURCE_PATHに隠されていないファイルが多すぎると、エラーが報告されます。 SOURCE_PATHが空の場合、エラーは報告されません。また、DEST_PATHが存在しない場合、最終的にSOURCE_PATHのコピーとして生成されます。
GNU実装では、cp
同じことができます。
cp -rT SOURCE_PATH DEST_PATH
(ターゲットがディレクトリの場合でもコピー先の代わりに強制コピー-T
とも呼ばれます)--no-target-directory