ตัวเลือกที่กว้างเป็นอันดับแรกในยูทิลิตี้ `find 'ของ Linux?


12

มีตัวเลือกความกว้าง / ลึก - แรกในยูทิลิตี้ `find 'ของ Linux หรือไม่?

คำตอบ:


5

ไม่มีอะไรในตัวที่จะค้นหาแม้แต่ GNU ก็พบ คุณสามารถประมวลผลผลลัพธ์ของfindการเรียงลำดับตามจำนวนเครื่องหมายทับตัวอย่างเช่นด้วย Perl:

find ... | perl -e 'print sort {$a=~s!/!/! <=> $b=~s!/!/!} <>'
  • <> คือรายการของอินพุตทั้งหมด
  • $a =~ s!/!/!gคือจำนวนเครื่องหมายทับ$aซึ่งเราใช้เป็นเกณฑ์การเรียงลำดับ

หากคุณสามารถใช้ zsh:

echo **/*(oe\''REPLY=${REPLY//[^\/]}'\')
  • **/* แสดงรายการไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันและไดเรกทอรีย่อย
  • สิ่งที่อยู่ในวงเล็บคือตัวระบุแบบกลม
  • ตัวระบุแบบกลมoeจะควบคุมลำดับที่จะส่งคืนการจับคู่: เรียงลำดับตามค่าREPLYหลังจากเรียกใช้โค้ดที่นี่ในเครื่องหมายคำพูดสำหรับการแข่งขันแต่ละครั้งโดยREPLYตั้งค่าเริ่มต้นเป็นเส้นทางที่ตรงกัน
  • รหัสดังกล่าวแปลง$REPLYเพื่อลบทุกอย่างยกเว้นเครื่องหมายทับ ดังนั้นผลลัพธ์ประกอบด้วยทุกอย่างที่ความลึก 1 (ว่างเปล่าที่เกิดขึ้น$REPLY) จากนั้นทุกอย่างที่ความลึก 2 ( $REPLYจบลงด้วยการเป็น/) ความลึก 3 ( //) เป็นต้น

1
กระบวนการเรียงลำดับการโพสต์นั้นน่าสนใจมากอย่างไรก็ตามการเรียงลำดับจำเป็นต้องค้นหาให้เสร็จสมบูรณ์และคุณจะไม่มีโอกาสควบคุมการแตกหัก
XièJìléi


1

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

มีทรัพยากรมากขึ้นเนื่องจาก:

  • ฟอร์กมากมาย
  • พบมากมาย
  • แต่ละไดเรกทอรีก่อนที่ความลึกปัจจุบันจะได้รับผลกระทบโดยการค้นหาหลายครั้งเนื่องจากมีความลึกรวมถึงโครงสร้างไฟล์ (ซึ่งไม่น่าจะเป็นปัญหาหากคุณมี RAM จำนวนเท่าใด ... )

นี่เป็นสิ่งที่ดีเพราะ:

  • มันใช้ทุบตีและเครื่องมือ gnu พื้นฐาน
  • มันสามารถแตกได้ทุกเมื่อที่คุณต้องการ (เช่นคุณเห็นสิ่งที่คุณกำลังมองหาบิน)
  • มันทำงานได้ต่อบรรทัดและไม่ใช่ต่อการค้นหาดังนั้นคำสั่งที่ตามมาจึงไม่ต้องรอการค้นหาและการเรียงลำดับ
  • มันทำงานบนพื้นฐานของการแยกระบบไฟล์จริงดังนั้นถ้าคุณมีไดเรกทอรีที่มีสแลชอยู่มันจะไม่ถูกแสดงในรายการลึกกว่านั้น หากคุณมีตัวคั่นพา ธ อื่นที่กำหนดค่าไว้คุณก็ยังใช้ได้
#! / bin / ทุบตี 
ความลึก = 0

ในขณะที่ค้นหา -mindepth $ depth -maxdepth $ depth | grep '.'
ทำ
    ความลึก = $ ((ความลึก + 1))
เสร็จแล้ว

คุณสามารถใส่ลงในหนึ่งบรรทัดได้อย่างง่ายดาย

depth=0; while find -mindepth $depth -maxdepth $depth | grep --color=never '.'; do depth=$((depth + 1)); done

แต่ฉันชอบสคริปต์ขนาดเล็กมากกว่าการพิมพ์ ...

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