ฉันต้องการค้นหาไฟล์ 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หรือksh93globs:
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ด้วยoNglob 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ก็จะชื่นชมคุณมาก แต่มันเป็นสถานการณ์ที่ค่อนข้างผิดปกติ (งานของคุณแม้จะมี) และเราไม่มีเหตุผลใดที่จะเชื่อว่าผู้ถามต้องจัดการกับสิ่งนั้นดังนั้นฉันคิดว่าประเด็นที่คุณกำลังทำอยู่ในขณะที่ถูกต้องนั้นเป็นสิ่งที่ทำให้เสียสมาธิ - และฉันคิดว่าวิธีที่มีพลังที่คุณใช้ถ้อยคำมันผลักดันคำตอบสู่อาณาจักรของ "(อาจ) ไม่มีประโยชน์" (แน่นอนความเห็นของฉันเท่านั้น)