จะหาซอฟต์ลิงค์ (ลิงก์สัญลักษณ์) ทั้งหมดในไดเรกทอรีปัจจุบันได้อย่างไร?


10

bashคำถามที่เกี่ยวข้องกับเชลล์สคริปต์ใน

วิธีตรวจสอบกับสคริปต์ว่าไฟล์ใดในไดเรกทอรีปัจจุบันคือซอฟต์ลิงค์?

ในกรณีที่ฉันได้ใช้คำผิดเมื่อฉันบอกว่าการเชื่อมโยงนุ่ม , ln -sผมหมายถึงไฟล์ที่สร้างขึ้นโดยใช้

สิ่งเดียวที่ฉันคิดได้คือการประเมินls -laว่าเป็นนิพจน์และแยกผลลัพธ์ แต่เห็นได้ชัดว่านี่ไม่ใช่ทางออกที่ดีที่สุด


1
พวกเขากำลังเรียกว่า "ลิงก์สัญลักษณ์" (ตรงข้ามกับ "ลิงก์ยาก")
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

Righto ผมรู้ว่าผมอาจมีผิดคำขอบคุณสำหรับหัวขึ้น
bguiz

ซอฟต์ลิงค์ก็ใช้ได้เช่นกัน แต่มีที่ว่าง :-) ( en.wikipedia.org/wiki/Symbolic_link )
Arjan

คำตอบ:


14

ดู'การแสดงออกตามเงื่อนไข'ในman bash- ในกรณีนี้คุณต้องการ-h:

for file in *
do
  if [ -h "$file" ]; then
    echo "$file"
  fi
done

2
faqs.org/docs/bashman/bashref_68.html - สำหรับนิพจน์ที่มีเงื่อนไขทำให้อ่านได้ดีกว่า man page
Manos Dilaverakis

ขอบคุณ @Polsy และ @Manos! test -hคือสิ่งที่ฉันต้องการ!
bguiz

14

คุณอาจไม่ต้องการสคริปต์จริงๆ หากต้องการแสดงลิงก์สัญลักษณ์ใด ๆ ในโฟลเดอร์ปัจจุบันโดยไม่ต้องเรียกไปยังโฟลเดอร์ย่อยใด ๆ :

หา -maxdepth 1 -type l -print

หรือเพื่อรับข้อมูลเพิ่มเติมใช้หนึ่งใน:

หา -maxdepth 1 -type l -exec ls -ld {} +
หา -maxdepth 1 -type l -print0 | xargs -0 ls -ld

หากต้องการบอกว่าไฟล์เป็นลิงก์สัญลักษณ์ไฟล์หนึ่งสามารถใช้ได้readlinkซึ่งจะไม่แสดงผลใด ๆ หากไม่ใช่ลิงก์สัญลักษณ์ ตัวอย่างต่อไปนี้ไม่ค่อยมีประโยชน์ แต่จะแสดงวิธีreadlinkละเว้นไฟล์และโฟลเดอร์ปกติ ใช้หนึ่งใน:

หา -maxdepth 1 -exec readlink {} +
หา -maxdepth 1 -print0 | xargs -0 readlink

โปรดทราบว่าข้างต้น-exec ... +และxargs ...เร็วกว่า-exec ... \;มาก ชอบ:

เวลาค้นหา / usr / bin -maxdepth 1 -type l -exec ls -ld {} \;
จริง 0m0.372 วินาที
ผู้ใช้ 0m0.087s
sys 0m0.163s

time find / usr / bin -maxdepth 1 -type l -exec ls -ld {} +
จริง 0m0.013s
ผู้ใช้ 0m0.004s
sys 0m0.008s

การค้นหาเวลา / usr / bin -maxdepth 1 -type l -print0 | xargs -0 ls -ld
จริง 0m0.012s
ผู้ใช้ 0m0.004s
sys 0m0.009s

ฉันชอบคำตอบของ Polsy ที่ดีกว่ายังคง +1 สำหรับคุณเนื่องจากฉันอาจต้องทำนอกสคริปต์ shell สักวัน
bguiz

1
คุณไม่จำเป็นต้องมี xargs คุณสามารถใช้การค้นหา -maxdepth 1 -exec readlink {} \;
stib

ทรู @stib แต่xargsเป็นจำนวนมากได้เร็วขึ้นบน Mac ของฉัน ดูการแก้ไขของฉัน แต่ผมได้เรียนรู้สิ่งใหม่ ๆ วันนี้: ยังมี+แทน\;(แม้ว่าบางคนก็อ้างว่ามี / มีปัญหากับgrep.)
Arjan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.