
この回答次のように、ディレクトリ内のすべてのファイル(隠しファイルを含む)をsrc
ディレクトリにコピーできることがわかりました。dest
mkdir dest
cp -r src/. dest
回答やコメントには、これが実際に機能する理由についての説明はなく、文書を見つけた人は誰もいないようです。
私はいくつか試してみました。まず、正常な状況:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src dest
$ ls -A dest
dest_file src
それから/.
最後に:
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/. dest
$ ls -A dest
dest_file .dotfile src_dir src_file
したがって、同様に動作します*
が、隠されたファイルもコピーします。
$ mkdir src src/src_dir dest && touch src/src_file src/.dotfile dest/dest_file
$ cp -r src/* dest
$ ls -A dest
dest_file src_dir src_file
.
そして..
正しいハードリンクがありますか?ここで説明されています、ディレクトリエントリ自体と同じです。
この動作はどこで発生し、どこに文書化されていますか?
答え1
これは録音アルゴリズムの論理的な結果ですcp -R
。バラよりPOSIX、ステップ2f:
ディレクトリ内のファイルソースファイルこのディレクトリにコピーする必要があります宛先ファイル、ここにリストされている4つのステップ(1〜4)を実行すると、ファイルは次のようになります。ソースファイル。
.
ディレクトリはそれぞれ現在の..
ディレクトリと親ディレクトリです。シェルに関する限り、どちらも特別ではないため、拡張も含まれず、隠しファイルを含むディレクトリがコピーされます。*
一方、ファイルのリストに展開され、ここで隠されたファイルはフィルタリングされます。
src/.
内部の現在のディレクトリは再び親ディレクトリであるsrc
ため、外部またはソースファイルとして指定することはsrc
同じで、隠しファイルを含むコンテンツをコピーします。src/src_dir/..
src_dir
src
src
src
src/.
src/src_dir/..
cp
src
指定のポイントは、ディレクトリ(またはディレクトリへのシンボリックリンク)ではない場合はsrc/.
失敗しますが、その逆ではありません。また、それ自体ではなくコンテンツのみをコピーします。これは文書とも一致します。src
src
src
src
もしターゲット既存のディレクトリが存在し、名前が付けられ、ファイル階層内の各ファイルに対応するターゲットパスの名前を関連付ける必要があります。ターゲット、単一のスラッシュ文字(ターゲットがスラッシュで終わらない場合)、インクルードディレクトリへの相対ファイルのパス名ソースファイル。
したがって、cp -R src/. dest
to(ソースファイルがある場所)の内容がコピーされ、to(ソースファイルがある場所)の内容がコピーされます。src
dest/.
.
src
cp -R src dest
src
dest/src
src
それについて考えるもう1つの方法は、合計を比較するのではなく、コピーとsrc/src_dir
合計を比較することです。動作は前のケースと同じです。src/.
src/.
src
.
src_dir
答え2
実行するとcp -R src/foo dest
取得しますdest/foo
。したがって、ディレクトリがdest/foo
存在しない場合は、cp
ディレクトリが作成され、その内容は次のとおりsrc/foo
ですdest/foo
。
を実行しているcp -R src/. dest
ことをcp
確認しdest/.
、内容src/.
を にコピーしますdest/.
。
.
fromというディレクトリをコピーしsrc
、その内容を既存のディレクトリとマージすると考えるとdest/.
わかります。