ค้นหาโดยไม่ต้องเรียกซ้ำ


246

เป็นไปได้หรือไม่ที่จะใช้findคำสั่งในวิธีการที่มันจะไม่หักเงินคืนในไดเรกทอรีย่อย? ตัวอย่างเช่น,

DirsRoot
  |-->SubDir1
  |    |-OtherFile1
  |-->SubDir2
  |    |-OtherFile2
  |-File1
  |-File2

และผลลัพธ์ของบางสิ่งบางอย่างfind DirsRoot --donotrecuourse -type fจะเป็นเช่นไรFile1, File2?

คำตอบ:


380

ฉันคิดว่าคุณจะได้รับสิ่งที่คุณต้องการด้วย-maxdepth 1ตัวเลือกตามโครงสร้างคำสั่งปัจจุบันของคุณ ถ้าไม่ได้คุณสามารถลองมองไปที่หน้าคนfindสำหรับ

รายการที่เกี่ยวข้อง (เพื่อความสะดวก):

-maxdepth levels
          Descend at most levels (a non-negative integer) levels of direc-
          tories below the command line arguments.   `-maxdepth  0'  means
          only  apply the tests and actions to the command line arguments.

ตัวเลือกของคุณโดยทั่วไปคือ:

find DirsRoot/* -maxdepth 0 -type f #This does not show hidden files

หรือ:

find DirsRoot/ -maxdepth 1 -type f #This does show hidden files

สำหรับตัวอย่างของ OP ฉันคิดว่านี่จะต้องเป็น-maxdepth 1อย่างไร
Paul R

@ พอล R: อันที่จริงแล้วการเรียงลำดับนั้นขึ้นอยู่กับว่าเขาต้องการจัดการกับไฟล์ที่ซ่อนอยู่ แต่ฉันได้แก้ไขคำตอบของฉันแล้ว สำหรับตัวอย่างของเขา1อาจเป็นสิ่งที่เขาต้องการ
eldarerathis

1
สำหรับฉัน-maxdepth 0ไม่แสดงไฟล์ใด ๆแต่-maxdepth 1ทำงานได้ตามที่คาดหวังพร้อมแสดงไฟล์ที่ซ่อนอยู่ด้วย
Bruce Wayne

1
@BruceWayne ทราบใน* find DirsRoot/* -maxdepth 0 -type fถ้าคุณปล่อยมันไว้มันจะไม่แสดงไฟล์ใด ๆ
mapeters

@ มุกขอบคุณ แต่ฉันจำไม่ได้ว่าบริบทดั้งเดิมที่ฉันมีปัญหานี้คืออะไรฮ่าฮ่า
Bruce Wayne

33

-maxdepth 1ผมเชื่อว่าคุณกำลังมองหา


1
สำหรับตัวอย่างของ OP ฉันคิดว่านี่จะต้องเป็น-maxdepth 1อย่างไร
Paul R

ใช่ถ้าเขาใช้คำสั่งตรงตามตัวอย่างเขาจะเป็น 1 ความผิดพลาดของฉัน
waffle เส้นขนาน

17

หากคุณมองหาโซลูชันที่สอดคล้องกับ POSIX:

cd DirsRoot && find . -type f -print -o -name . -o -prune

-maxdepthไม่ใช่ตัวเลือกที่สอดคล้องกับ POSIX


ขอบคุณสำหรับโซลูชันนี้ แต่สิ่งนี้ไม่สามารถลดความซับซ้อนได้find DirsRoot/* -type f -pruneหรือ
dokaspar

@dokaspar เป็นคำถามที่ยอดเยี่ยมจริงๆ! (คุณลืมใส่ "-o" ก่อน-prunebtw) คำตอบคือไม่สามารถทำได้ เพื่อให้เข้าใจอย่างถ่องแท้ว่าทำไมมันไม่สามารถทำให้ง่ายขึ้นได้เพียงแค่เปล่งset -xคำสั่งก่อนที่จะเปล่งfind DirsRoot/* -type f -o -pruneและคุณจะเห็นมันทันที สาเหตุที่เป็นข้อ จำกัด ของการขยายตัวของDirsRoot/*การแสดงออกของเปลือก
sqr163

ไม่ทำงานบน centos ยังคงทำการเรียกซ้ำเต็มรูปแบบที่เอาต์พุต !!!! คำสั่งที่เหมาะสมคือfind . -name . -o -prune
Reishin

บน Solaris ต่อไปการรักษาด้วย DirsRoot เป็นเส้นทางที่ต้องการคุณไม่จำเป็นต้องมี cd; คุณสามารถ: ค้นหา DirsRoot / -type f -print -o -name -o -prune
spioter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.