cp -L と cp -H

cp -L と cp -H

問題

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シンボリック リンクを作成できません。たとえば、ソース ツリー内のシンボリック リンク (通常のファイルへの) は、宛先ツリー内の通常のファイルにコピーされます。

シンボリックリンクが通常のファイルではないことは知っていますが、ここでの説明は難しすぎると認めざるを得ません。

答え1

シンボリックリンクを使用すると、ツールは次の 2 つの操作を実行できます。

  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

関連情報