
現在あるディレクトリをコピーしたいです。私は前に試しましたcp -a . ~/xyz
ディレクトリの内容をコピーしますが、次のように動作します。cp -a "$(pwd)" ~/xyz
[必要に応じてコンテンツを含むディレクトリもコピーされます。 ]
DotはSplatがやっていることをするようです。なぜ動作しないのです.
か?
答え1
.
これは、サブディレクトリの作成にその名前を使用できないために行われます。
cp -a . ~/xyz
、など./file1
にコピーします。しかし、とは同じであるため、現在のディレクトリの内容を 。~/xyz/./file1
./file2
~/xyz/./file2
~/xyz/./file1
~/xyz/file1
~/xyz
--verbose
cp
コピー時に各パス名を表示するオプションを追加すると、それを確認できます。
$ cp -av . ../foo/
‘./file1’ -> ‘../foo/./file1’
‘./file2’ -> ‘../foo/./file2’
.
これとここ*
で注目すべき違いの1つは、(隠しファイルと一致しません)とは異なり、隠しcp -a . /dir
ファイルをコピーすることです。*
~
これは*
シェルメタ文字です。つまり、cp
シェルが表示前に拡張されることを意味します。一方、これは.
通常のディレクトリエントリです(このエントリを含むディレクトリを指します)。再帰コピーがソースのcp
場合を検出し、ディレクトリ名を変更するコードを含めることができますが、.
そうではありません。おそらく、誰もそれが重要だとは思わないからです。
また、どんな名前で呼ぶべきですか?ファイルシステムは通常、ディレクトリへの複数のハードリンクを許可しないため、ファイルよりもディレクトリに対して簡単です(および.
エントリ..
を除く)。しかし、これはシンボリックリンクを考慮しません。最新のシェルはシンボリックリンクを介してディレクトリに入ったときにそれを追跡し、それをpwd
。