問題
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
はどちらのオプションでもまったく同じですが、info cp
の表現私をさらに混乱させます。多分これを少し分解するのを助けることができます:
-H
コマンドライン引数がシンボリックリンクを指定している場合、シンボリックリンクではなく、それが指すファイルをコピーする自体。ただし、再帰的なトラバーサルで遭遇するコピー(その性質を保持する)シンボリックリンク。
これは私には矛盾しているように聞こえます:"シンボリックリンクの性質"はどこかを指していると思います…
-L, --dereference
コピーするときは、シンボリックリンクをたどってください。このオプションを使用すると、cp
はシンボリックリンクを作成できません。たとえば、ソースツリーの(通常のファイルへの)シンボリックリンクは、宛先ツリーの通常のファイルにコピーされます。
シンボリックリンクが通常のファイルではないことは確かですが、ここではこの説明に苦労しています。
シンボリックリンクを使用すると、ツールには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
-L
と-H
の動作の違いは、-r
も指定されている場合に発生します。 cp
は-L -r
のサブディレクトリにシンボリックリンクを作成しませんが、-H -r
を使用すると作成されます。