cp -L vs cp -H

46

Masalah

Saat menyalin file dengan cp -Hatau cp -L, saya mendapatkan hasil yang sama:

$ ls -l fileA
  fileA -> fileB
$ cp fileA somewhere/ -H
$ ls -l somewhere/
  fileA     # fileA is a copy of fileB, only renamed, with same properties!

Jawaban ini di sini menjelaskan kedua opsi sebagai KECUALI serupa yang digunakan dalam kombinasi dengan -R. Bukan untuk saya. Soft-as file yang di-hardlink diubah menjadi salinan dari file yang mereka tunjuk di sumbernya.
 

Pertanyaan :

Apa penggunaan yang tepat dari cp -Hdan cp -L? Apakah ini perilaku yang diharapkan?


  Usaha saya untuk mengatasi : man cpmemberitahu saya persis sama untuk kedua pilihan, tapi info cp's kata-kata yang membuatnya bahkan lebih membingungkan bagi saya. Mungkin seseorang dapat membantu saya memecah ini sedikit:

-H Jika argumen baris perintah menentukan tautan simbolik, maka salin file yang ditunjuknya daripada tautan simbolik itu sendiri. Namun, salin (mempertahankan sifatnya) tautan simbolis yang ditemui melalui traversal rekursif.

Ini kedengarannya seperti kontradiksi bagi saya: Saya kira itu » sifat tautan simbolis « adalah bahwa itu menunjuk ke suatu tempat ...

-L, --dereference Ikuti tautan simbolis saat menyalin dari mereka. Dengan opsi ini, cptidak dapat membuat tautan simbolis. Misalnya, symlink (ke file biasa) di pohon sumber akan disalin ke file biasa di pohon tujuan.

Saya tahu bahwa symlink bukan file biasa, tapi ... Saya akui saya terlalu tertantang dengan penjelasan ini di sini.

erch
sumber
Jalankan info cp, cari -R. Dikatakan Copy directories recursively. Tapi Anda sedang menguji dengan non-direktori. Perbedaannya adalah tentang apa yang ada di dalam direktori yang Anda salin, bukan argumen baris perintah.
Mikel
@Mikel Saya sudah mencoba menyalin isi direktori dan menyalin direktori dengan konten itu sendiri dan mendapatkan hasil yang sama. Juga: Saya duduk cukup lama di depan info cpdan berusaha keras untuk mencari tahu apa arti sebenarnya dari pilihan kata pada opsi ini & ndash; dan tentang postingan ini. Posting ini juga mengandung kata-kata aktual dari info cp- jadi saya setidaknya harus membukanya ...;)
erch

Jawaban:

56

Dengan symlink, alat memiliki dua hal yang dapat mereka lakukan:

  1. Perlakukan symlink sebagai symlink ("melestarikan sifatnya"), atau
  2. Perlakukan symlink sebagai jenis file yang ditunjuknya.

Mengatakan bahwa -H"menjaga sifatnya" bukanlah kontradiksi. Pertimbangkan alternatifnya. Jika Anda menggunakan -L, setiap symlink yang cpditemukan akan dibuka, dan isinya disalin ke nama file target. Jadi sumbernya adalah symlink, tetapi salinannya bukan symlink. Jadi "kehilangan sifatnya sebagai symlink".

Mempertimbangkan

$ 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  
Mikel
sumber
Jawaban yang bagus — saya suka cara Anda menggambarkan apa yang dilakukan opsi. Itu tidak cukup menjawab pertanyaan saya , yaitu tentang menyalin symlink ke direktori saudara, tetapi Anda telah membuatnya jelas bagaimana saya bisa melakukan percobaan cepat untuk mengetahuinya. 😉
Michael Scheper
1
Ah, ternyata yang benar-benar ingin saya ketahui adalah ini: superuser.com/a/138594/219388
Michael Scheper
19

Perbedaan perilaku antara -Ldan -Hdatang saat -rditentukan juga. cptidak akan membuat symlink di subdirektori dengan -L -rtetapi itu akan terjadi jika Anda menggunakannya -H -r.

Kyle Jones
sumber
cp: opsi -H, -L, dan -P mungkin tidak ditentukan dengan opsi -r.
3z33etm