find
(สำหรับ-name
/ เพรดิเคต-path
มาตรฐาน) ใช้รูปแบบสัญลักษณ์แทนเช่น globs (โปรดทราบว่า{a,b}
ไม่ใช่ตัวดำเนินการแบบวงกลมหลังจากการขยายคุณจะได้รับสอง globs) ความแตกต่างที่สำคัญคือการจัดการทับ (และจุดไฟล์และ dirs ไม่ได้รับการปฏิบัติเป็นพิเศษในfind
) *
ใน globs จะไม่ครอบคลุมหลายไดเรกทอรี */*/*
จะทำให้รายการไดเรกทอรีมากถึง 2 ระดับ การเพิ่ม-path './*/*/*'
จะตรงกับไฟล์ใด ๆ ที่มีความลึกอย่างน้อย 3 ระดับและจะไม่หยุดการแสดงfind
รายการเนื้อหาของไดเรกทอรีใด ๆ ที่ระดับความลึกใด ๆ
สำหรับเรื่องนั้นโดยเฉพาะ
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
คู่ของ globs มันง่ายต่อการแปลคุณต้องการไดเรกทอรีที่ระดับความลึก 3 ดังนั้นคุณสามารถใช้:
find . -mindepth 3 -maxdepth 3 \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
(หรือ-depth 3
มีfind
การใช้งานบางอย่าง) หรือ POSIXly:
find . -path './*/*/*' -prune \
\( -path './foo*bar/quux[A-Z].bak/pic[0-9][0-9][0-9][0-9]?.jpg' -o \
-path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg' \) \
-exec cmd {} +
ซึ่งจะรับรองได้ว่าสิ่งเหล่านั้น*
และ?
ไม่สามารถจับคู่/
ตัวละคร
( find
ตรงกันข้ามกับ globs จะอ่านเนื้อหาของไดเรกทอรีอื่นนอกเหนือจากfoo*bar
ที่อยู่ในไดเรกทอรีปัจจุบัน and และไม่เรียงลำดับรายการไฟล์ แต่ถ้าเราทิ้งปัญหาที่สิ่งที่ถูกจับคู่[A-Z]
หรือพฤติกรรมของ*
/ ?
เกี่ยวกับอักขระที่ไม่ถูกต้องคือ ไม่ได้ระบุคุณจะได้รับรายชื่อไฟล์เดียวกัน)
แต่ไม่ว่าในกรณีใด ๆ ตามที่@muru ได้แสดงขึ้นไม่จำเป็นต้องหันไปใช้find
ถ้าเพียงเพื่อแยกรายการของไฟล์ออกเป็นหลายการทำงานเพื่อหลีกเลี่ยงข้อ จำกัด ของการexecve()
เรียกระบบ บางเชลล์เช่นzsh
(พร้อมzargs
) หรือksh93
(พร้อมcommand -x
) ยังมีการสนับสนุนในตัวด้วย
ด้วยzsh
(ซึ่ง globs ยังมีภาคเทียบเท่า-type f
และภาคอื่น ๆ ส่วนใหญ่find
) เช่น:
autoload zargs # if not already in ~/.zshrc
zargs ./foo*bar/quux[A-Z](|.bak)/pic[0-9][0-9][0-9][0-9]?.jpg(.) -- cmd
( (|.bak)
เป็นผู้ประกอบการทางตรงกันข้าม glob เพื่อ{,.bak}
ที่(.)
glob คัดเลือกเทียบเท่าของfind
's -type f
เพิ่มoN
ในการมีที่จะข้ามการเรียงลำดับเช่นเดียวกับfind
, D
จะรวมจุดไฟล์ (ใช้ไม่ได้กับ glob นี้))
¹สำหรับfind
การรวบรวมข้อมูลไดเรกทอรีต้นไม้อย่าง globs คุณจะต้องมีสิ่งต่อไปนี้:
find . ! -name . \( \
\( -path './*/*' -o -name 'foo*bar' -o -prune \) \
-path './*/*/*' -prune -name 'pic[0-9][0-9][0-9][0-9]?.jpg' -exec cmd {} + -o \
\( ! -path './*/*' -o -name 'quux[A-Z]' -o -name 'quux[A-Z].bak' -o -prune \) \)
นั่นคือการตัดไดเรกทอรีทั้งหมดที่ระดับ 1 ยกเว้นไดเรกทอรีfoo*bar
และที่ระดับ 2 ยกเว้นquux[A-Z]
หรือไดเรกทอรีquux[A-Z].bak
จากนั้นเลือกpic...
ไดเรกทอรีที่ระดับ 3 (และตัดไดเรกทอรีทั้งหมดที่ระดับนั้น)
-path
ควรจะทำงาน - ยกเว้นว่ามันจะตรงกับ นั่นจะเป็นปัญหาหรือไม่?-ipath
find . -path './foo*bar/quux[A-Z]/pic[0-9][0-9][0-9][0-9]?.jpg'
/fooz/blah/bar/quuxA/pic1234d.jpg