cp -L กับ cp -H


44

ปัญหา

เมื่อคัดลอกไฟล์ด้วย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ไม่สามารถสร้างลิงก์สัญลักษณ์ ตัวอย่างเช่น symlink (ไปยังไฟล์ปกติ) ในแผนผังต้นไม้จะถูกคัดลอกไปยังไฟล์ปกติในแผนผังปลายทาง

ฉันรู้ว่า symlink ไม่ใช่ไฟล์ปกติ แต่…ฉันยอมรับว่าฉัน overchallenged กับคำอธิบายนี้ที่นี่


เรียกใช้ค้นหาinfo cp -Rมันบอกว่าCopy directories recursively. แต่คุณกำลังทดสอบกับไม่ใช่ไดเรกทอรี ข้อแตกต่างเกี่ยวกับสิ่งที่อยู่ภายในไดเรกทอรีที่คุณกำลังคัดลอกไม่ใช่อาร์กิวเมนต์บรรทัดคำสั่ง
มิเคล

@Mikel ฉันพยายามคัดลอกเนื้อหาของไดเรกทอรีและคัดลอกไดเรกทอรีด้วยเนื้อหาของตัวเองและได้ผลลัพธ์ที่ค่อนข้างเหมือนกัน อีกทั้ง: ฉันนั่งค่อนข้างนานต่อหน้าinfo cpและพยายามอย่างหนักที่จะคิดออกว่าการเลือกคำในตัวเลือกนี้หมายถึง & ndash; และสิ่งที่โพสต์นี้เป็นเรื่องเกี่ยวกับ โพสต์ยังมีข้อความจริงจากinfo cp- ดังนั้นฉันจะต้องเปิดอย่างน้อยมัน…;)
erch

คำตอบ:


54

ด้วย symlink เครื่องมือมีสองสิ่งที่สามารถทำได้:

  1. ถือว่า symlink เป็น symlink ("รักษาธรรมชาติ") หรือ
  2. ถือว่า symlink เป็นประเภทของไฟล์ที่ชี้ไป

การพูดว่า-H"รักษาธรรมชาติของมัน" ไม่ใช่ความขัดแย้ง พิจารณาทางเลือก หากคุณใช้-Lsymlink ที่cpพบจะถูกเปิดขึ้นและเนื้อหาจะถูกคัดลอกไปยังชื่อไฟล์เป้าหมาย ดังนั้นแหล่งที่มาคือ symlink แต่การคัดลอกไม่ใช่ symlink ดังนั้นจึง "สูญเสียธรรมชาติเป็น symlink"

พิจารณา

$ 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  

คำตอบที่ดี - ฉันชอบวิธีที่คุณแสดงให้เห็นว่าตัวเลือกทำอะไร มันไม่ได้ตอบคำถามของฉันซึ่งเกี่ยวกับการคัดลอก symlink ไปยังไดเรกทอรี sibling แต่คุณได้ระบุไว้อย่างชัดเจนว่าฉันสามารถทำการทดลองอย่างรวดเร็วเพื่อค้นหาได้อย่างไร 😉
Michael Scheper

1
อาปรากฎว่าสิ่งที่ฉันอยากรู้คือ: superuser.com/a/138594/219388
Michael Scheper

19

ความแตกต่างในพฤติกรรมระหว่าง-Lและ-Hมาเมื่อ-rมีการระบุเช่นกัน cpจะไม่สร้าง symlinks ในไดเรกทอรีย่อยที่มีแต่จะถ้าคุณใช้-L -r-H -r


cp: ตัวเลือก -H, -L และ -P อาจไม่ถูกระบุพร้อมกับตัวเลือก -r
3z33etm
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.