ฉันจะค้นหาติดตามได้อย่างไรส่วนใหญ่ แต่ไม่ทั้งหมดลิงก์สัญลักษณ์?


10

ระบบปฏิบัติการและโฮมไดเรกทอรีของฉันอยู่ใน SSD ฉันเก็บไฟล์ขนาดใหญ่ไว้ในฮาร์ดดิสก์และ symlink จากโฮมไดเร็กตอรี่ของฉันไปยังฮาร์ดดิสก์ (เช่น. ~ / Videos / Films เป็น symlink ไปยัง / mnt / hdd / Films) ฉันยังมีหมายเลขนำหน้าจำนวนไวน์ซึ่งแต่ละอันมี dosdevices / z: symlinked to /

ดังนั้นถ้าฉันใช้ find โดยไม่มี -L มันจะพลาดทุกอย่างที่อยู่ในฮาร์ดดิสก์ แต่ถ้าฉันใช้ find ด้วย -L ​​มันจะสิ้นสุดในลูปเนื่องจาก symlink ของไวน์เป็น /

มีวิธีที่เหมาะสมในการแก้ไขปัญหานี้เพื่อค้นหาสิ่งที่ฉันต้องการหรือไม่ อย่างสังหรณ์ใจฉันต้องการบางสิ่งบางอย่างตามแนวของ "ติดตาม symlinks ยกเว้นว่าพวกเขาอยู่ภายใต้ไดเรกทอรีที่เรียกว่า dosdevices" "ติดตาม symlink ที่อยู่บนฮาร์ดดิสก์" ก็ใช้ได้เช่นกัน

คำตอบ:


11

-pruneหลักบอกfindไม่ recurse ภายใต้ไดเรกทอรี

find -L -path ~/.wine/dosdevices -prune -o -type f -name 'My Favorite Movie.*' -print

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

find ~ /mnt/hdd -xtype f -name 'My Favorite Movie.*'

คุณอาจเรียกใช้find ~ -type l …เพื่อรวบรวมรายการลิงก์สัญลักษณ์และใช้เป็นรากเพิ่มเติม

( IFS=$'\n'; set -f;
  find ~ $(find ~ -type l -lname '/mnt/hdd/*') \
       -xtype f -name 'My Favorite Movie.*' )

หากคุณต้องการรับเงินคืนภายใต้ลิงก์สัญลักษณ์คุณสามารถยกเว้นลิงก์สัญลักษณ์เฉพาะตามเป้าหมายแทนที่จะเป็นชื่อ อย่างไรก็ตามคุณสามารถยกเว้นรายการที่แน่นอนได้ไม่ใช่รูปแบบหรือทรีย่อยด้วยวิธีนี้

find -L \( -samefile /exclude/this -o -samefile ~/and/that \) -prune -o \
     -type f -name 'My Favorite Movie.*' -print

คุณสามารถใช้เกณฑ์อื่น ๆ เช่น! -writable(ไฟล์ที่คุณไม่ได้รับอนุญาตให้เขียน) แต่ฉันไม่คิดว่า GNU find จะมีวิธีการเรียกเก็บเงินคืนภายใต้ลิงก์สัญลักษณ์เฉพาะเมื่อข้อความเป้าหมายตรงกับนิพจน์ที่แน่นอน

คุณสามารถสร้างfindคำสั่งที่ทำเกือบทุกอย่างที่คุณต้องการยกเว้นไม่รวมลิงก์สัญลักษณ์ที่เพียงพอเรียกใช้find2perlเพื่อแปลงแบบสอบถามเป็นสคริปต์ Perl และปรับแต่งสคริปต์ Perl เล็กน้อย มีสวิตช์จำนวนมากของ GNU พบว่า find2perl ไม่รู้จักอย่างไรก็ตาม


ขอบคุณ! -pruneเป็นเพียงสิ่งที่ฉันกำลังมองหา ฉันพบว่ามีfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype dรายการลิงก์ทั้งหมดที่ฉันไม่ต้องการติดตาม ตอนนี้ฉันกำลังพยายามหาวิธีใช้คิวรีนั้นเพื่อตัด
Mark Raymond

@ MarkRaymond หลักการทั่วไปคือfind ~ <negative criteria> -prune -o <positive criteria> -printดังนั้นfind ~ \( -lname ~ -o -lname ~/\* -o -lname / \) -xtype d -prune -o <whatever it is you want> -print
Gilles '

@Giles - ใช้งานได้ดีโดยไม่มี -L แต่เมื่อฉันเพิ่ม -L นิพจน์ -lname จะไม่ทำงานอีกต่อไป (เนื่องจากหน้า man บอกว่าไม่ใช้) ดังนั้นโดยทั่วไปแล้วฉันต้องการเงื่อนไขบางอย่างในการติดตาม symlinks และอื่น ๆ ที่ไม่ให้
Mark Raymond

ฉันไม่สามารถคิดวิธีการทำสิ่งที่คุณต้องการด้วยการค้นหา ดูการแก้ไขของฉันสำหรับการประมาณค่าบางอย่าง
Gilles 'หยุดความชั่วร้าย'


0

คุณมี symlink ต่อฮาร์ดดิสก์กี่ตัว? หากไม่ใช่วิธีเดียวที่มากเกินไปคือไม่ต้องใช้ "-L" ในขณะที่ระบุ symlink ที่คุณต้องการติดตามในบรรทัดคำสั่ง find อย่างชัดเจน สิ่งที่ต้องการ:

find .  ~/Videos/Films -name '*file I want*' ...

วิธีนี้จะค้นหาไดเรกทอรีปัจจุบัน (".") รวมถึง symlink "~ / Videos / Films" แต่จะไม่เชื่อมโยงไปยัง symlink อื่น ๆ


0

วิธีแก้ปัญหาอื่นที่ทำให้เกิดปัญหา (อย่างน้อยสำหรับกรณีของฉัน) คือการใช้การเชื่อมโยงแบบเชื่อมแทนการเชื่อมโยงสัญลักษณ์สำหรับไดเรกทอรีบนฮาร์ดดิสก์ สิ่งนี้ทำได้โดยการเพิ่มรายการ/etc/fstabดังนี้:

/mnt/hdd/Films /home/mark/Videos/Films none bind 0 0

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