ค้นหา PDF ทั้งหมดที่มีอักขระอย่างน้อยสามตัวในชื่อ


9

ฉันต้องการค้นหาไฟล์ PDF ที่มีชื่อ (ไม่รวมส่วนขยาย) มากกว่าสามไฟล์

$ find ~ -iregex ".{3,}/.pdf"

ไม่มีอะไรคืน แต่

$ find ~ -iregex ".+/.pdf"

โรงงาน

ฉันจะเปิดใช้งาน{3,}ชุดตัวเลือกได้อย่างไร


ความยาวเท่าไหร่ ชื่อไฟล์ยาวหรือไม่ หน้ายาวหรือไม่
Ignacio Vazquez-Abrams

คำตอบ:


18

สมมติว่าคุณกำลังใช้ 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 ออกจากกล่อง)


20

ที่นี่ง่ายขึ้นด้วยสัญลักษณ์แทนมาตรฐาน:

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)regexp
    • FIGNORE: ตัวแปรพิเศษที่ควบคุมไฟล์ที่ถูกละเว้นโดย 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)


สิ่งนี้จะใช้กับ Bash ได้หรือไม่ shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
wjandrea

7

ฉันจะรู้ได้อย่างไรว่าเป็น PDF

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


1
หากผู้ถามมีสถานการณ์เดียวกับคุณที่มีไฟล์ PDF ที่ชื่อไม่สิ้นสุดผู้คนในเมือง.pdfก็จะชื่นชมคุณมาก แต่มันเป็นสถานการณ์ที่ค่อนข้างผิดปกติ (งานของคุณแม้จะมี) และเราไม่มีเหตุผลใดที่จะเชื่อว่าผู้ถามต้องจัดการกับสิ่งนั้นดังนั้นฉันคิดว่าประเด็นที่คุณกำลังทำอยู่ในขณะที่ถูกต้องนั้นเป็นสิ่งที่ทำให้เสียสมาธิ - และฉันคิดว่าวิธีที่มีพลังที่คุณใช้ถ้อยคำมันผลักดันคำตอบสู่อาณาจักรของ "(อาจ) ไม่มีประโยชน์" (แน่นอนความเห็นของฉันเท่านั้น)
David Z

เนื่องจากเราเป็นคนคล่องแคล่วคุณจะจัดการไฟล์ PDF เช่นPoC | | GTFO polyglots ได้อย่างไร
Stephen Kitt

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

@DavidZ ฉันไม่แน่ใจว่าจะพูดอะไรกับสิ่งนั้น ฉันหมายความว่ามันช่างพูดไม่เก่งหรอกนะที่จะชี้ให้เห็นว่าฉันเป็นคนช่างพูดเมื่อฉันพูดมากไปแล้ว? นี่คือเหตุผลที่ไม่มี "ไม่มีประโยชน์": โซลูชันที่ดีสำหรับการค้นหา PDF ควรเป็นโซลูชันที่ปรับเปลี่ยนได้สำหรับการค้นหาสคริปต์ไบนารีที่ปฏิบัติการห้องสมุดไฟล์สื่อ ฯลฯ ฉันไม่สามารถแม้แต่จะเริ่มเห็นว่าฉันจะปรับตัวอย่างไร คำตอบอื่น ๆ สำหรับ "executables Mach ที่บีบอัด" แต่ฉันยินดีที่จะเรียนรู้
รวย

1
@ ริชไฟล์ PDF จำนวนมากยังเป็นไฟล์ ZIP บางไฟล์เป็นรูปภาพหรือแม้กระทั่งเครื่องเสมือนที่บู๊ตได้ ... (ดูที่ลิงก์“ สปอยเลอร์” ในปัญหาแรก ๆ สำหรับคำแนะนำส่วนที่เหลือจะบันทึกไว้ในไฟล์ PDF ด้วยตนเอง)
Stephen Kitt
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.