ฉันต้องการค้นหาไฟล์ PDF ที่มีชื่อ (ไม่รวมส่วนขยาย) มากกว่าสามไฟล์
$ find ~ -iregex ".{3,}/.pdf"
ไม่มีอะไรคืน แต่
$ find ~ -iregex ".+/.pdf"
โรงงาน
ฉันจะเปิดใช้งาน{3,}
ชุดตัวเลือกได้อย่างไร
ฉันต้องการค้นหาไฟล์ PDF ที่มีชื่อ (ไม่รวมส่วนขยาย) มากกว่าสามไฟล์
$ find ~ -iregex ".{3,}/.pdf"
ไม่มีอะไรคืน แต่
$ find ~ -iregex ".+/.pdf"
โรงงาน
ฉันจะเปิดใช้งาน{3,}
ชุดตัวเลือกได้อย่างไร
คำตอบ:
สมมติว่าคุณกำลังใช้ GNU find
(ซึ่งคุณอาจจะเนื่องจาก-iregex
เป็นส่วนขยายของ GNU เพื่อPOSIXfind
) -regex
และ-iregex
เริ่มต้นที่จะแสดงออกปกติ Emacs {3,}
ซึ่งไม่รู้จัก คุณต้องระบุนิพจน์ทั่วไปประเภทอื่นโดยใช้-regextype
ตัวเลือก นอกจากนี้คุณต้องปรับการแสดงออกปกติของคุณให้สอดคล้องกับการแสดงออกที่ตรงกับเส้นทางเต็ม:
find ~ -regextype posix-extended -iregex '.*/[^/]{3,}.pdf'
คุณควรหลีกเลี่ยง.
เพื่อให้ตรงกับ“.” มากกว่าตัวละครใด ๆ :
find ~ -regextype posix-extended -iregex '.*/[^/]{3,}\.pdf'
การแสดงออกปกติสามารถทำให้เข้าใจง่ายขึ้นเนื่องจากเราสนใจเฉพาะอักขระที่ไม่ใช่ -“ /” สามตัว:
find ~ -regextype posix-extended -iregex '.*[^/]{3}\.pdf'
เพื่อความสมบูรณ์ด้วย FreeBSD หรือ NetBSD find
(การใช้งานอื่นที่สนับสนุน-iregex
ไม่ใช่ของคุณแม้ว่า.+
จะไม่ทำงานที่นั่น-E
) คุณเขียน:
find ~ -iregex '.*[^/]\{3\}\.pdf'
หรือ:
find -E ~ -iregex '.*[^/]{3}\.pdf'
โดยไม่ต้อง-E
นั่นคือการแสดงออกปกติขั้นพื้นฐาน (เหมือนในgrep
) และมี-E
การแสดงออกปกติขยาย (เช่นในgrep -E
)
ด้วย ast-open find
:
find ~ -iregex '.*[^/]{3}\.pdf'
(นั่นคือการขยาย regexps ออกจากกล่อง)
ที่นี่ง่ายขึ้นด้วยสัญลักษณ์แทนมาตรฐาน:
find ~ -name '*???.[pP][dD][fF]'
หรือกับfind
การใช้งานบางอย่าง(ผู้ที่สนับสนุน-regex
ก็สนับสนุน-iname
)
find ~ -iname '*???.pdf'
สำหรับจำนวนตัวอักษรโดยพลการแทน3
นั่นคือที่ที่คุณอาจต้องการกลับไป-iregex
ใช้ที่มีอยู่ (ดูคำตอบของ @Stephen Kitt ) หรือคุณสามารถใช้zsh
หรือksh93
globs:
zsh
:
set -o extendedglob # best in ~/.zshrc
printf '%s\n' ~/**/?(#c3,).(#i)pdf(D)
(การ(D)
พิจารณาไฟล์ที่ซ่อนอยู่และไฟล์ใน dirs ซ่อนเหมือนfind
)
(#cx,y)
เป็นzsh
สัญลักษณ์แทนของ regexp{x,y}
(#i)
สำหรับกรณีตาย?
อักขระตัวแทนมาตรฐานสำหรับอักขระเดี่ยวใด ๆ (เช่น regexp .
)**/
: ไดเรกทอรีย่อยทุกระดับ (รวมถึง 0)ksh93
:
FIGNORE='@(.|..)' # to consider hidden files
set -o globstar
printf '%s\n' **/{3,}(?).~(i:pdf)
@(x|y)
: ผู้ประกอบการ ksh สัญลักษณ์แทนการขยายคล้ายกับ (x|y)
regexpFIGNORE
: ตัวแปรพิเศษที่ควบคุมไฟล์ที่ถูกละเว้นโดย globs เมื่อตั้งค่าการละเว้นไฟล์ที่ซ่อนอยู่ตามปกติจะไม่เสร็จ แต่เรายังคงต้องการละเว้น.
และ..
รายการไดเรกทอรีที่มีอยู่{x,y}(z)
เป็นksh93
's เทียบเท่า z{x,y}
regexp~(i:...)
: การจับคู่ตัวพิมพ์เล็กและตัวพิมพ์ใหญ่Globs มีข้อได้เปรียบพิเศษตรงfind
นี้ในการที่คุณจะได้รับรายการที่เรียงลำดับ (คุณสามารถปิดการใช้งานการเรียงลำดับzsh
ด้วยoN
glob qualifier หรือใช้เกณฑ์การเรียงลำดับที่แตกต่างกัน) และยังทำงานเมื่อชื่อไฟล์มีลำดับของไบต์ที่ อินสแตนซ์ในโลแคลที่ใช้ชุดอักขระ UTF-8 find
แนวทางจะล้มเหลวในการรายงาน$'St\xE9phane Chazelas - CV.pdf
ว่า\xE9
ไม่ใช่อักขระที่ไม่ถูกจับคู่โดย regexp .
หรือ wildcard ?
หรือ*
กับ GNU find
)
shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
คุณทำไม่ได้นอกจากคุณจะถาม แน่นอนว่าฉันมีความอวดความรู้ แต่คุณไม่ได้ถามเกี่ยวกับไฟล์ที่มี.pdf
ในชื่อของพวกเขา เพียงเพราะไฟล์ที่มีตัวอักษร.pdf
ในชื่อไฟล์ไม่ได้ทำให้มันเป็นไฟล์ PDF
ในความเป็นจริงขอให้เป็นคนทุกที่อวดความรู้เกี่ยวกับวิธีการนี้ถ้าสุดท้ายสี่ตัวอักษรของชื่อไฟล์ที่มี.pdf
แล้วมันก็จะมีมากกว่าสามตัวอักษรในชื่อ
ดังนั้นเมื่อทำสิ่งนี้ผิดคุณอาจพูดว่า:
$ find . -type f -name "*???.pdf"
./Documents/McLaren 720s Coupe:Order Summary.pdf
./Documents/Setup_MagicISO.exe.pdf
เห็นไหมว่าอันที่สอง? อันที่จริงมันเป็นปฏิบัติการ (ฉันรู้ว่าฉันเปลี่ยนชื่อ) และฉันยังขาด PDF ที่ฉันสาบานได้ในไดเรกทอรีเอกสาร ...
$ ls Documents
McLaren 720s Coupe:Order Summary.pdf
Pioneer Premier DEH-P490IB CD Install Manual.PDF
Setup_MagicISO.exe.pdf
ดังนั้นเมื่อใช้-iname
เราจะพบไฟล์นั้นได้ แต่นั่นยังคงเปิดไฟล์ที่ไม่ใช่ไฟล์ PDF
สิ่งที่เราจริงๆต้องการที่จะทำในกรณีนี้คือการตรวจสอบไฟล์จำนวนมายากลโดยใช้file
คำสั่ง ตัวเลือกหนึ่งออกประเภท MIMEซึ่งง่ายต่อการแยกวิเคราะห์ แบบสอบถามแล้วจะกลายเป็นง่ายfind
-name "???*"
$ find . -type f -name "???*" -print0|xargs -0 file --mime
./.bash_history: text/plain; charset=us-ascii
./.bash_logout: text/plain; charset=us-ascii
./.bashrc: text/plain; charset=us-ascii
./.profile: text/plain; charset=us-ascii
./Documents/McLaren 720s Coupe:Order Summary.pdf: application/pdf; charset=binary
./Documents/Pioneer Premier DEH-P490IB CD Install Manual.PDF: application/pdf; charset=binary
./Documents/Setup_MagicISO.exe.pdf: application/x-dosexec; charset=binary
./Downloads/Setup_MagicISO.exe: application/x-dosexec; charset=binary
./Downloads/WindowsUpdate.diagcab: application/vnd.ms-cab-compressed; charset=binary
ลองใช้ตัวคั่นลำไส้ใหญ่แล้วมองหาประเภท MIME application/pdf
จากนั้นก็ตัดส่วนที่เป็นศูนย์ออกแล้วพิมพ์ผลลัพธ์ จดบันทึกหนึ่งในไฟล์ของฉันมีเครื่องหมายโคลอนในชื่อ ดังนั้นฉันไม่สามารถขอให้ตกใจ($2==":"){print $1}
ได้
$ find . -type f -name "???*" -print0|xargs -0 file --mime|awk -F: '($NF~"application/pdf"){OFS=":";$NF="";print}'|sed s/:$//
./Documents/McLaren 720s Coupe:Order Summary.pdf
./Documents/Pioneer Premier DEH-P490IB CD Install Manual.PDF
ทีนี้มาจบกันด้วยการตั้งชื่อไฟล์ PDF a
และabc
:
$ mkdir Documents/other
$ cp -a Documents/McLaren\ 720s\ Coupe\:Order\ Summary.pdf Documents/other/a
$ cp -a Documents/Pioneer\ Premier\ DEH-P490IB\ CD\ Install\ Manual.PDF Documents/other/abc
$ find . -type f -name "???*" -print0|xargs -0 file --mime|awk -F: '($NF~"application/pdf"){OFS=":";$NF="";print}'|sed s/:$//
./Documents/McLaren 720s Coupe:Order Summary.pdf
./Documents/Pioneer Premier DEH-P490IB CD Install Manual.PDF
./Documents/other/abc
นั่นคือทั้งหมดที่ ฉันรู้ว่าฉันอาจจะถูกด่าว่าเป็นคนอวดดี แต่ในงานของฉันที่มีโวลุ่ม NFS หลายพันตัวเพื่อตามล่าและไฟล์ที่มีชื่อไม่ดีทุกชนิดฉันหวังว่าผู้คนจะอวดรู้
แก้ไขเพื่อเพิ่ม: ในโลกแห่งความเป็นจริงฉันอาจต้องการใช้updatedb
เพื่อสร้างดัชนีไฟล์ที่ค้นหาได้locate
แทนที่จะfind
อ่านดัชนีนั้นและparallel
แทนที่จะxargs
เป็นเธรด ที่ค่อนข้างนอกขอบเขตของคำถามนี้ว่า ฉันก็เขียนมันด้วยหน้าตรงเช่นกัน ทำไมฉันสนใจมาก ฉันอาจกำลังมองหาไฟล์ภาพยนตร์และไฟล์เสียง หรือภาพถ่ายบางประเภท หรือไบนารีที่ปฏิบัติการได้ในไดเรกทอรีข้อมูลโครงการ
.pdf
ก็จะชื่นชมคุณมาก แต่มันเป็นสถานการณ์ที่ค่อนข้างผิดปกติ (งานของคุณแม้จะมี) และเราไม่มีเหตุผลใดที่จะเชื่อว่าผู้ถามต้องจัดการกับสิ่งนั้นดังนั้นฉันคิดว่าประเด็นที่คุณกำลังทำอยู่ในขณะที่ถูกต้องนั้นเป็นสิ่งที่ทำให้เสียสมาธิ - และฉันคิดว่าวิธีที่มีพลังที่คุณใช้ถ้อยคำมันผลักดันคำตอบสู่อาณาจักรของ "(อาจ) ไม่มีประโยชน์" (แน่นอนความเห็นของฉันเท่านั้น)