web-dev-qa-db-ja.com

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 -Hcp -Lの正しい使い方は何ですか?これは予想される動作ですか?


私の解決策man cpはどちらのオプションでもまったく同じですが、info cp表現私をさらに混乱させます。多分これを少し分解するのを助けることができます:

-Hコマンドライン引数がシンボリックリンクを指定している場合、シンボリックリンクではなく、それが指すファイルをコピーする自体。ただし、再帰的なトラバーサルで遭遇するコピー(その性質を保持する)シンボリックリンク

これは私には矛盾しているように聞こえます:"シンボリックリンクの性質"はどこかを指していると思います…

-L, --dereferenceコピーするときは、シンボリックリンクをたどってください。このオプションを使用すると、cpはシンボリックリンクを作成できません。たとえば、ソースツリーの(通常のファイルへの)シンボリックリンクは、宛先ツリーの通常のファイルにコピーされます。

シンボリックリンクが通常のファイルではないことは確かですが、ここではこの説明に苦労しています。

49
erch

シンボリックリンクを使用すると、ツールには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  
65
Mikel

-L-Hの動作の違いは、-rも指定されている場合に発生します。 cp-L -rのサブディレクトリにシンボリックリンクを作成しませんが、-H -rを使用すると作成されます。

21
Kyle Jones