質問
cp -H
ファイルを使用またはコピーするとcp -L
同じ結果が得られます。
$ ls -l fileA
fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
fileA # fileA is a copy of fileB, only renamed, with same properties!
この回答はここにありますと一緒に使用しない限り、両方のオプションが似ていると説明します-R
。私には適していません。ハードリンクファイルと同様に、ソフトリンクファイルはソースが指すファイルの名前が変更されたコピーになります。
質問:
cp -H
との正しい使い方は何ですかcp -L
?これが予想される動作ですか?
私は解決しようとしています:
man cp
これら2つのオプションはまったく同じinfo cp
ですが、馬の種私をさらに混乱させる。たぶん、誰かが私がそれを分析するのに役立ちます。
-H
コマンドライン引数がシンボリックリンクを指定する場合シンボリックリンクの代わりに指すファイルをコピーしてください。それ自体。しかし、すべてのシンボリックリンクのコピー(属性の維持)これは再帰巡回によって起こります。
これは私に矛盾して聞こえます。私の考えでは»シンボリックリンクの性格「どこかを指しています...
-L, --dereference
コピーするときは、シンボリックリンクに従ってください。このオプションを使用すると、cp
シンボリックリンクを作成できません。たとえば、ソースツリーの(一般ファイルへの)シンボリックリンクは、ターゲットツリーの一般ファイルにコピーされます。
私はシンボリックリンクが一般的なファイルではないことを知っていますが...ここの説明はあまりにも挑戦的であることを認めています。
答え1
ツールはシンボリックリンクを使用して、次の2つのことを実行できます。
- シンボリックリンクをシンボリックリンクであるかのように処理します(「本質保存」)。
- シンボリックリンクをそれが指すファイルの種類と考えてください。
-H
「本質を維持する」と言うのは矛盾ではありません。代替案を検討してください。を使用すると、見つかったすべてのシンボリックリンクが開き、-L
その内容がターゲットファイル名にコピーされます。cp
したがって、ソースはシンボリックリンクですが、コピーはそうではありません。したがって、「シンボリックリンクの本質を失う」。
考える
$ mkdir subdir
$ echo "some contents" > subdir/file
$ ln -s file subdir/link
# definition of "list", the abbreviated ls -l output used below
$ list() { ls -l "$@" | \
awk '$0 !~ /^total/ { printf "%s %s\t%s %s %s\n", $1, $5, $9, $10, $11 }' ; }
$ list subdir
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rH subdir subdir-with-H
$ list subdir-with-H
-rw-rw-r-- 14 file
lrwxrwxrwx 4 link -> file
$ cp -rL subdir subdir-with-L
$ list subdir-with-L
-rw-rw-r-- 14 file
-rw-rw-r-- 14 link
答え2
-L
との動作の違いは、指定された -H
場合にも発生します。サブディレクトリにはシンボリックリンクは作成されませんが。-r
cp
-L -r
-H -r