当時、CPは非常に奇妙に振る舞った。 (ドット)または..(ドット)はソースディレクトリです。

当時、CPは非常に奇妙に振る舞った。 (ドット)または..(ドット)はソースディレクトリです。

この回答次のように、ディレクトリ内のすべてのファイル(隠しファイルを含む)を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_dirsrcsrcsrcsrc/.src/src_dir/..cpsrc

指定のポイントは、ディレクトリ(またはディレクトリへのシンボリックリンク)ではない場合はsrc/.失敗しますが、その逆ではありません。また、それ自体ではなくコンテンツのみをコピーします。これは文書とも一致します。srcsrcsrcsrc

もしターゲット既存のディレクトリが存在し、名前が付けられ、ファイル階層内の各ファイルに対応するターゲットパスの名前を関連付ける必要があります。ターゲット、単一のスラッシュ文字(ターゲットがスラッシュで終わらない場合)、インクルードディレクトリへの相対ファイルのパス名ソースファイル

したがって、cp -R src/. destto(ソースファイルがある場所)の内容がコピーされ、to(ソースファイルがある場所)の内容がコピーされます。srcdest/..srccp -R src destsrcdest/srcsrc

それについて考えるもう1つの方法は、合計を比較するのではなく、コピーとsrc/src_dir合計を比較することです。動作は前のケースと同じです。src/.src/.src.src_dir

おすすめ記事