ค้นหาไม่ทำงานบนเส้นทาง symlinked?


15

ถ้าฉันเรียกใช้คำสั่งนี้find $HOME/MySymlinkedPath -name "run*.sh"ไม่มีอะไรเกิดขึ้นและไม่มีข้อผิดพลาด ('MySymlinkedPath' เป็นเส้นทาง symlinked ไปยังฮาร์ดไดรฟ์อื่น ๆ แล้ว $ HOME ของฉัน)

สิ่งเหล่านี้ล้มเหลว:

find ~/MySymlinkedPath -name "run*.sh"
find /home/MyUserName/MySymlinkedPath -name "run*.sh"

และเพื่อให้แน่ใจว่าเส้นทางที่ไม่มีอยู่นี้ล้มเหลว (แน่นอน) find $HOME/MySymlinkedPathDUMMYTEST -name "run*.sh"ดังนั้นจึงมีการค้นพบเส้นทาง (เพราะข้อผิดพลาดนั้นไม่ได้เกิดขึ้น) แต่findไม่ได้ทำการค้นหาบนเส้นทางนี้

ใช้งานได้เฉพาะถ้าฉันcd $HOME/MySymlinkedPathก่อนและลบการอ้างอิงเส้นทางเช่นนี้find -name "run*.sh"แต่นั่นไม่ดีสำหรับสคริปต์ของฉัน

ข้อมูลเพิ่มเติม :
คำสั่งนี้ใช้งานได้ตามปกติls $HOME/MySymlinkedPath/run*.shและถ้าฉันไปที่นั่นcd $HOME/MySymlinkedPathและรันสิ่งนี้ls ..ผลลัพธ์ไม่ใช่สิ่งที่ฉันคาดหวัง - รายการของเส้นทางที่เส้นทาง symlinked ตั้งอยู่ - จะส่งกลับรายการเส้นทางที่แท้จริงของ สื่ออื่น / ฮาร์ดไดรฟ์ !!!

pwd -P
/media/MediaIdentifier/RealPath
pwd
/home/MyUser/MySymlinkedPath

คิดใหม่ :
นี่เป็นปัญหากับfindและlsหรือกับระบบของฉันหรือไม่ หรือเป็นที่คาดหวังและไม่มีปัญหาเลย? ฉันใช้ Ubuntu 12.10 มันล้มเหลวในเทอร์มินัลทั้งหมดที่ฉันทดสอบดังนั้นจึงดูเหมือนว่า "ปัญหา" มินัลไม่ได้


1
ฉันพบคำตอบที่ดีกว่า "find -follow" stackoverflow.com/questions/105212/…
Jarod

@Jarod man page พูดว่า - สาวกถูกคัดค้านและเราควรใช้ -L (นั่นคือ - follow) ตามที่คำตอบของฉันด้านล่าง:>
พลังกุมภ์

คำตอบ:


20

นี่คือคำตอบ แต่คำถามนั้นชี้ไปที่ทุบตีเป็นเป้าหมายของปัญหา

คำอธิบายที่พบfind "$HOME/MySymlinkedPath"มันเป็นลิงก์สัญลักษณ์ไม่ใช่ไดเรกทอรีดังนั้นโคตรซ้ำจะหยุดอยู่ตรงนั้น หากการจับคู่นิพจน์"$HOME/MySymlinkedPath"(ตัวอย่างเช่นในfind "$HOME/MySymlinkedPath" -name 'My*') findจะพิมพ์ว่าเป็นการจับคู่

ตามที่ชี้ไปที่นั่นฉันพบว่าวิธีที่ง่ายที่สุด / สะอาดที่สุดในการจัดการกับมันและแก้ไขสคริปต์ทั้งหมดคือแทนที่จะ:

find "$HOME/MySymlinkedPath" -name "run*.sh"

เพียงเพิ่มเครื่องหมายทับเพื่อfindไม่ให้เริ่มจากลิงก์สัญลักษณ์ แต่มาจากเป้าหมายของลิงก์สัญลักษณ์:

find "$HOME/MySymlinkedPath/" -name "run*.sh"

อีกทางหนึ่งผ่าน-Hตัวเลือกไปที่find(โปรดทราบว่ามันจะต้องมาก่อนเส้นทางก่อน) เพื่อบอกให้มันผ่านการเชื่อมโยงสัญลักษณ์การส่งผ่านในบรรทัดคำสั่งของมัน (นี่คือสิ่งที่แตกต่างจาก-Lที่บอกfindให้เชื่อมโยงสัญลักษณ์การสำรวจพบในระหว่างการสืบเชื้อสายซ้ำเช่นกัน)

find -H "$HOME/MySymlinkedPath" -name "run*.sh"

และในที่สุดมันก็ใช้งานได้ดีที่สุดกับที่นี่-L(เพราะระบบไฟล์หลายอันฉันมี symlinked thru โฟลเดอร์) แต่มันสร้างข้อความแสดงข้อผิดพลาดที่ไม่มีปัญหาดังนั้นฉันจึงเพิ่ม2>/dev/null; และตัดสินใจสร้างนามแฝงนี้ด้วยalias find='find -L':

find -L "$HOME/MySymlinkedPath" -name "run*.sh" 2>/dev/null

2
IMHO เป็นวิธีปฏิบัติที่ดีโดยทั่วไปในการใช้เครื่องหมายสแลชต่อท้ายไดเรกทอรีเพื่อระบุว่าเป็นไดเรกทอรีจริง :) ทำให้ทุกอย่างอ่านง่ายขึ้น ฯลฯ
dannysauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.