รายการไฟล์ตามเป้าหมาย symlink


23

ฉันจะรับรายชื่อไฟล์ (จากนั้นทำบางสิ่งบางอย่างกับรายการนั้น) โดยการกรองผ่านชื่อเป้าหมายลิงก์สัญลักษณ์ไม่ใช่ชื่อ symlink ตัวอย่างจากรายการต่อไปนี้ฉันสนใจเฉพาะไฟล์สี่ไฟล์แรก (เป้าหมายมีbar):

foo ->  /tmp/bar
bar ->  /home/me/bartoo
baz ->  /home/me/public/barthree
zoo ->  /usr/share/bar
moo ->  /tmp/foo
roc ->  /tmp/roc

คำตอบ:


31

คุณสามารถใช้ find เพื่อดึงไฟล์ทั้งหมดที่มีประเภท symlink และเพิ่ม-ilnameตัวเลือกในการค้นหาตามชื่อของปลายทางลิงค์ สิ่งนี้ใช้งานได้-inameแต่คล้ายกับชื่อลิงก์เป้าหมายแทนชื่อลิงก์

find -type l -ilname "*bar*"

นั่นจะยังคงพิมพ์ชื่อลิงก์ไม่ใช่เป้าหมาย หากคุณต้องการพิมพ์ชื่อของเป้าหมายให้ลองทำดังนี้:

find -type l -ilname "*bar*" -printf "%l\n"

หรือรับlsเอาท์พุทแบบเต็ม

find -type l -ilname "*bar*" -ls

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

find -type l -ilname "*bar*" -exec touch {} \;

แต่ถ้าคุณต้องการใช้งานลิงค์เป้าหมายคุณจะต้องใช้ปุ่ม-printfเพื่อรับค่าเป้าหมายจากนั้นxargsหรือวนลูปเองเพื่อใช้งาน คุณสามารถทำสิ่งนี้:

find -type l -printf "%l\n" | grep bar | xargs touch

... ซึ่งแสดงให้เห็นถึงวิธีการใช้grepแทนfind -ilnameการจับคู่ชื่อของคุณแม้ว่าคุณจะสามารถทำได้เช่นกัน


ขอบคุณ Caleb! คุณตอบคำถามทันทีของฉันอย่างครบถ้วนรวมถึงครอบคลุมบางช่องทางที่ฉันจะใช้เช่นกัน
matt wilkie

1
ความคิดใด ๆ ที่ว่าทำไมมันถึงใช้find /dev/disk/ -type l -ilname "*sde*"งานไม่ได้?
กุมภ์

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