`cp -a ./dir`がディレクトリの代わりにコンテンツをコピーするのはなぜですか?

`cp -a ./dir`がディレクトリの代わりにコンテンツをコピーするのはなぜですか?

現在あるディレクトリをコピーしたいです。私は前に試しましたcp -a . ~/xyz

ディレクトリの内容をコピーしますが、次のように動作します。cp -a "$(pwd)" ~/xyz
[必要に応じてコンテンツを含むディレクトリもコピーされます。 ]

DotはSplatがやっていることをするようです。なぜ動作しないのです.か?

ベストアンサー1

.これは、サブディレクトリの作成にその名前を使用できないために行われます。

cp -a . ~/xyz、など./file1にコピーします。しかし、とは同じであるため、現在のディレクトリの内容を 。~/xyz/./file1./file2~/xyz/./file2~/xyz/./file1~/xyz/file1~/xyz

--verbosecpコピー時に各パス名を表示するオプションを追加すると、それを確認できます。

$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’

.これとここ*で注目すべき違いの1つは、(隠しファイルと一致しません)とは異なり、隠しcp -a . /dirファイルをコピーすることです。*

~これは*シェルメタ文字です。つまり、cpシェルが表示前に拡張されることを意味します。一方、これは.通常のディレクトリエントリです(このエントリを含むディレクトリを指します)。再帰コピーがソースのcp場合を検出し、ディレクトリ名を変更するコードを含めることができますが、.そうではありません。おそらく、誰もそれが重要だとは思わないからです。

また、どんな名前で呼ぶべきですか?ファイルシステムは通常、ディレクトリへの複数のハードリンクを許可しないため、ファイルよりもディレクトリに対して簡単です(および.エントリ..を除く)。しかし、これはシンボリックリンクを考慮しません。最新のシェルはシンボリックリンクを介してディレクトリに入ったときにそれを追跡し、それをpwd

おすすめ記事