ค้นหาการใช้งานด้วย -L


34

ฉันมี

link -> file

ฉันทำ

find -L . -name 'link'

และรับ

./link

ทำไมถึงเป็นอย่างนั้น?

คนค้นหาพูดว่า:

-L: ทำตามลิงก์สัญลักษณ์ เมื่อพบการตรวจสอบหรือพิมพ์ข้อมูลเกี่ยวกับไฟล์ข้อมูลที่นำมาใช้จะต้องนำมาจากคุณสมบัติของไฟล์ที่จุดเชื่อมโยงไม่ใช่จากลิงค์ตัวเอง (เว้นแต่จะเป็นลิงก์สัญลักษณ์แบบย่อหรือค้นหาไม่สามารถตรวจสอบไฟล์ได้ จุดเชื่อมโยง)

คำตอบ:


12

ด้วย-Lจะตรวจสอบคุณสมบัติของไฟล์ - เนื้อหาหรือข้อมูลเมตาไม่ใช่ของลิงก์ เช่นถ้าคุณใช้-atimeมันจะตรวจสอบatimeไฟล์ไม่ใช่ลิงค์:

$ find testdir/ -name link -newer testdir/ref
testdir/link
$ find -L testdir/ -name link -newer testdir/ref
$

testdir/linkถูกสร้างขึ้นหลังจากtestdir/refแต่ไฟล์ที่ชี้ไปที่ไม่ใช่


1
คุณช่วยอธิบายการเป็นตัวอย่างของฉันได้ไหม สิ่งที่ฉันเข้าใจคือ: ในตัวอย่างของฉัน find เริ่มการค้นหา มันพบ. / ลิงค์ตั้งแต่ -L มีผลบังคับใช้มัน dereferences มันและใช้คุณสมบัติของ. / ไฟล์ มันเปรียบเทียบชื่อ. ไฟล์กับรูปแบบ 'ลิงก์' และเนื่องจากไม่ตรงกันจึงไม่ควรรายงาน o / p ใด ๆ มีอะไรผิดปกติกับเหตุผลของฉัน?
Ankur Agarwal

จากคู่มือการค้นหาที่คุณอ้างถึง "ข้อมูลที่ใช้จะต้องนำมาจากคุณสมบัติของไฟล์ที่ลิงก์ชี้ไป" ชื่อของไฟล์ไม่ใช่คุณสมบัติอย่างใดอย่างหนึ่งดังนั้นจึงยังคงใช้ชื่อของลิงก์ นั่นเป็นประโยชน์อย่างยิ่งมากกว่าชื่อของไฟล์จริง
เควิน

"ชื่อของไฟล์ไม่ใช่คุณสมบัติอย่างใดอย่างหนึ่ง" ฉันไม่ทราบ คุณลักษณะอื่น ๆ ของไฟล์ที่ไม่ถือว่าเป็นคุณสมบัติ? พูดตามตรงฉันยังคงสงสัยและจะรอในสิ่งที่คนอื่นพูด
Ankur Agarwal

เช่นเดียวกับ @abc ไม่รู้ว่าชื่อไฟล์ไม่ใช่คุณสมบัติของไฟล์ ฉันจะหาข้อมูลชิ้นนี้ได้จากเอกสารและ / หรือหน้าคนใด โปรดดูที่ฉันสามารถเรียนรู้เพิ่มเติมเกี่ยวกับคุณสมบัติไฟล์
โจ๊ก

34

กฎทั่วไปคือถ้าคำสั่งดำเนินการกับลิงก์ (เช่นรายการไดเรกทอรีซึ่งเป็นตัวชี้ไปยัง inodes) ดังนั้นคำสั่งจะใช้ symlink เหมือนกันแทนที่จะเป็นวัตถุที่ลิงก์ชี้ไป มิฉะนั้นคำสั่งทำงานกับสิ่งที่ symlink ชี้ไป ดังนั้นcpตาม symlink โดยค่าเริ่มต้นและคัดลอกเนื้อหาของไฟล์ที่ชี้ไปที่ลิงค์ แต่เมื่อคุณขอcpให้จัดการกับรายการไดเรกทอรีโดยระบุ-Rมันจะหยุดติดตาม symlink mvทำงานกับรายการไดเรกทอรีได้ตลอดเวลาและดังนั้นจึงไม่เคยติดตาม symlinks

findกิจกรรมปกติคำสั่งคือการดำเนินการเกี่ยวกับรายการไดเรกทอรีดังนั้น symlinks ไม่ปฏิบัติตามโดยค่าเริ่มต้น การเพิ่ม-Lสาเหตุที่findจะติดตาม symlinks สำหรับคุณสมบัติทั้งหมดยกเว้นสาเหตุที่ไม่สามารถละเว้นได้เมื่อทำการค้นหาไดเรกทอรีชื่อ หนึ่งในวัตถุประสงค์ของfind -nameคือการให้การป้อนข้อมูลสำหรับคำสั่งเช่นmvและrmที่ทำงานในรายการไดเรกทอรี จะมีผลที่ไม่พึงประสงค์และที่น่าแปลกใจถ้าสามารถผลิตชื่อที่ชี้นอกต้นไม้ไดเรกทอรีรากที่find -L dir -namedir


ว้าว! ทำไมแนวคิดที่ละเอียดอ่อนนี้จึงไม่แสดงให้เห็นในหน้าคน (ยกเว้นฉันพลาด) นี่เป็นความประหลาดใจที่ยิ่งใหญ่สำหรับฉัน
Ankur Agarwal

2
@ ไคล์โจนส์There would be unpleasant and surprising results if ค้นหา -L dir -name` สามารถสร้างชื่อที่ชี้ไปด้านนอกไดเรกทอรีต้นไม้ที่หยั่งรากได้ที่ dir '=> นั่นไม่ควรจะเป็น: จะมีสิ่งที่ไม่พึงประสงค์ ... ถ้า find dir -name pattern... ? เพราะการเพิ่ม -L อนุญาตให้ชี้ไปที่ dir ภายนอก
timotheecour

ดังนั้นวิธีการ cp -Rคัดลอกเนื้อหาภายใต้ symlink?
javadba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.