Adlarında en az üç karakter bulunan tüm PDF'leri bulun


9

Adı (uzantı hariç) üçten büyük olan PDF dosyalarını bulmak istiyorum.

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

hiçbir şey döndürmez, ama

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

İşler.

{3,}Varyantı nasıl etkinleştirebilirim ?


Hangi uzunluk? Dosya adı uzunluğu? Sayfa uzunluğu?
Ignacio Vazquez-Abrams

Yanıtlar:


18

GNU find(muhtemelen POSIX-iregex için bir GNU uzantısı olduğu için ) kullandığınızı varsayar ve varsayılan olarak Emacs'ın normal ifadeleri tanımaz . Seçeneği kullanarak farklı türde normal ifadeler belirtmeniz gerekir ; ek olarak, normal ifadenizi ifadenin tam yolla eşleştiği gerçeğine göre ayarlamanız gerekir:find-regex-iregex{3,}-regextype

find ~ -regextype posix-extended -iregex '.*/[^/]{3,}.pdf'

Ayrıca .“.” İle eşleşmesi için de kaçmalısınız . herhangi bir karakter yerine:

find ~ -regextype posix-extended -iregex '.*/[^/]{3,}\.pdf'

Normal ifade basitleştirilebilir, çünkü yalnızca üç “/” olmayan karakteri önemsiyoruz:

find ~ -regextype posix-extended -iregex '.*[^/]{3}\.pdf'

Tamlık için, FreeBSD veya NetBSD ile find( orada olmadan çalışamayacağınız -iregexgibi sizinki desteklemeyen başka bir uygulama ), şunları yazacaksınız:.+-E

find ~ -iregex '.*[^/]\{3\}\.pdf'

veya:

find -E ~ -iregex '.*[^/]{3}\.pdf'

Olmadan -E, bu temel düzenli ifade (in gibi grep) ve -E genişletilmiş düzenli ifade (in gibi grep -E) ile.

Ast-open ile find:

find ~ -iregex '.*[^/]{3}\.pdf'

(kutunun dışında uzatılmış normal ifadeler).


20

Standart joker karakterlerle burada daha kolay:

find ~ -name '*???.[pP][dD][fF]'

Veya bazı finduygulamalarla (destekleyenler -regexde destekliyor -iname):

find ~ -iname '*???.pdf'

Yerine karakterlerin keyfi numaraları için 3size geri almadan tercih edebilirsiniz ediyor yani -iregex(bkz Müsait @Stephen Kitt cevabı ) veya kullanabileceğiniz zshveya ksh93globs:

  • zsh:

    set -o extendedglob # best in ~/.zshrc
    printf '%s\n' ~/**/?(#c3,).(#i)pdf(D)
    

    ( (D)gizli dosyaları ve gibi gizli dizinlerdeki dosyaları dikkate almak için find)

    • (#cx,y)olan zshregexp'nin Joker eşdeğeri{x,y}
    • (#i) büyük / küçük harfe duyarlı değil
    • ?herhangi bir tek karakter için standart joker karakter (regexp gibi .)
    • **/: herhangi bir alt dizin seviyesi (0 dahil)
  • ksh93:

    FIGNORE='@(.|..)' # to consider hidden files
    set -o globstar
    printf '%s\n' **/{3,}(?).~(i:pdf)
    
    • @(x|y): regexp benzeri genişletilmiş ksh joker operatörü (x|y).
    • FIGNORE: glob tarafından hangi dosyaların yoksayıldığını kontrol eden özel değişken. Ayarlandığında, gizli dosyaların olağan olarak yoksayılması yapılmaz, ancak varsa ve .ve ..dizin girişlerini hala yoksaymak istiyoruz .
    • {x,y}(z)olduğu ksh93regexp'nin 'in denk z{x,y}.
    • ~(i:...): büyük / küçük harfe duyarsız eşleme.

Globs'un findburada sıralı bir liste alması ( glob niteleyicisi zshile sıralamayı devre dışı bırakabilir oNveya farklı sıralama ölçütleri kullanabilirsiniz) ve dosya adları geçerli karakterler oluşturmayan baytlar dizisi içerdiğinde çalışabilmeniz için ekstra avantajlar vardır . örneğin, UTF-8 karakter kümesini kullanan bir yerel ayarda, findyaklaşım a karakterinin regexp veya joker karakterle veya GNU ile eşleşmediği $'St\xE9phane Chazelas - CV.pdfşeklinde rapor etmede başarısız olur ).\xE9.?*find


Bu Bash için işe yarar mı? shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
wjandrea

7

PDF olduklarını nasıl bilebilirim?

Siz istemedikçe yapmazsınız. Tabii, bilgiçim, ama isimleriyle dosyaları.pdf sormadın . Bir dosyanın .pdfdosya adındaki karakterlere sahip olması onu bir PDF dosyası yapmaz .

Aslında, bu konuda son derece bilgiç olalım: bir dosya adının son dört karakteri ise .pdf, adında her zaman üçten fazla karakter olacaktır .

Yani bunu yanlış bir şekilde yapmak , diyebilirsiniz:

$ find . -type f -name "*???.pdf"
./Documents/McLaren 720s Coupe:Order Summary.pdf
./Documents/Setup_MagicISO.exe.pdf

İkincisini gördün mü? Aslında çalıştırılabilir. (Biliyorum, adını değiştirdim.) Ve ayrıca yemin ettiğim bir PDF'yi de Belgeler dizininde buluyorum ...

$ ls Documents
McLaren 720s Coupe:Order Summary.pdf
Pioneer Premier DEH-P490IB CD Install Manual.PDF
Setup_MagicISO.exe.pdf

Yani bunu kullanarak -inamebulabiliriz, ancak bu hala PDF olmayan bir dosyayı açıyor.

Ne gerçekten bu durumda yapmak istiyorum dosyanın incelemek olduğunu sihirli sayı kullanılarak filekomutu. Bir seçenek , ayrıştırılması daha kolay olan MIME türünü çıkarır. findSorgu sonra basit bir hale gelir -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

İki nokta üst üste ayırıcısını kullanalım ve MIME türüne bakalım application/pdf, sonra bu kısmı sıfırlayın ve sonucu yazdırın. Dikkat edin, dosyalarımdan birinde iki nokta üst üste işareti var; bu yüzden sadece awk isteyemem ($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

Şimdi PDF dosyaları adlı içerecek şekilde contriving tarafından bitirelim ave 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

Bu kadar. Muhtemelen korkunç bilgiçlikten dolayı öleceğim biliyorum, ama avlanmak için binlerce NFS cilt ve her türlü kötü adlandırılmış dosya ile işimde daha fazla insanın bilgiçlikçili olmasını diliyorum.

Gerçek dünyada, ben faydalanmak isteyebilirsiniz: eklemek Düzenlendi updatedbaranabilir dosya dizin oluşturmak, locateyerine findve bu indeks okumak parallelyerine xargsiplik 'er kadar. Yine de bu sorunun kapsamı dışında kalıyor. Bunu düz bir yüzle de yazdım. Neden bu kadar önemsiyorum? Film ve ses dosyaları arıyordum; veya belirli tipte fotoğraflar; veya bir proje veri dizinindeki ikili yürütülebilir dosyalar.


1
Eğer asker isimler bitmez PDF dosyaları vardır yapmanız aynı durum vardır .pdf, sonra bilgiçlik çok takdir edilecektir. Ama bu oldukça sıra dışı bir durum (işiniz buna rağmen) ve askerin aslında bununla başa çıkmak zorunda olduğuna inanmak için bir nedenimiz yok, bu yüzden geçerli olduğunuzda, vurguladığınız noktanın biraz dikkat dağıtıcı olduğunu düşünüyorum - ve bunu ifade etmenin güçlü yolu cevabı "(muhtemelen) yararlı değil" alanına itiyor. (Tabii ki sadece benim görüşüm.)
David Z

Bilgiçlik yaptığımız için PoC || GTFO poliglotları gibi PDF'leri nasıl ele alırsınız ?
Stephen Kitt

@StephenKitt - Ne istediğinden emin değilim ama ilgimi çekti. Özellikle korkak isimlerle sıradan PDF'lere benziyorlar. Bunlar önerilen çözümümde başarısız olur mu?
Zengin

@DavidZ Buna ne diyeceğimi bilmiyorum. Yani, daha önce söylediğimde bilgiç olduğumu göstermek biraz bilgiç değil mi? İşte neden "yararlı değil": PDF bulmak için iyi bir çözüm, komut dosyaları, ikili yürütülebilir dosyalar, kütüphaneler, medya dosyaları, vb bulmak için uyarlanabilir bir çözüm olmalıdır . "sıkıştırılmış Mach yürütülebilir" için diğer cevaplar, ama öğrenmek istiyorum.
Zengin

1
PDF'leri birçok bazıları da görüntü, hatta önyüklenebilir sanal makineler ... vardır, ayrıca ZIP dosyaları vardır @Rich ( “spoiler” ipuçları için ilk birkaç konularda bağlantılara bakın, gerisi PDF'leri kendileri belgelenmiştir.)
Stephen Kitt
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.