Yanıtlar:
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 -iregex
gibi 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).
Standart joker karakterlerle burada daha kolay:
find ~ -name '*???.[pP][dD][fF]'
Veya bazı find
uygulamalarla (destekleyenler -regex
de destekliyor -iname
):
find ~ -iname '*???.pdf'
Yerine karakterlerin keyfi numaraları için 3
size geri almadan tercih edebilirsiniz ediyor yani -iregex
(bkz Müsait @Stephen Kitt cevabı ) veya kullanabileceğiniz zsh
veya ksh93
globs:
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 zsh
regexp'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 ksh93
regexp'nin 'in denk z{x,y}
.~(i:...)
: büyük / küçük harfe duyarsız eşleme.Globs'un find
burada sıralı bir liste alması ( glob niteleyicisi zsh
ile sıralamayı devre dışı bırakabilir oN
veya 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, find
yaklaşı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
shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
Siz istemedikçe yapmazsınız. Tabii, bilgiçim, ama isimleriyle dosyaları.pdf
sormadın . Bir dosyanın .pdf
dosya 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 -iname
bulabiliriz, 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 file
komutu. Bir seçenek , ayrıştırılması daha kolay olan MIME türünü çıkarır. find
Sorgu 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 a
ve 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 updatedb
aranabilir dosya dizin oluşturmak, locate
yerine find
ve bu indeks okumak parallel
yerine xargs
iplik '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.
.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.)