Ubuntu'da önce metne dönüştürmeden grep'in gücünü kullanarak pdf dosyalarını aramanın bir yolu var mı?
Ubuntu'da önce metne dönüştürmeden grep'in gücünü kullanarak pdf dosyalarını aramanın bir yolu var mı?
Yanıtlar:
Paketi kurun ve pdfgrep
sonra şu komutu kullanın:
find /path -iname '*.pdf' -exec pdfgrep pattern {} +
------
En basit yol
pdfgrep 'pattern' *.pdf
pdfgrep 'pattern' file.pdf
pdfgrep
Ayrıca özyinelemeli bir bayrak var. Yani bu cevabı belki düşürüldü olabilir: pdfgrep -R pattern /path/
. Her ne kadar bir PDF olmasa da her dosyadan geçerse daha az etkili olabilir. Ve å, ä ve ö gibi uluslararası karakterlerle ilgili sorunları olduğunu fark ettim.
-n
seçenek pdfgrep için bir profesyoneldir, çünkü sayfa numarasını çıktıya dahil etmeyi sağlar (daha fazla işlem için yardımcı olabilir).
pattern
? Nedir {}
? + 'Nın nesi var? İlk okuma hakkında hiçbir fikrim yok ... öyleyse gitmiş olduğum manpage'e, sanırım.
Eğer poppler-utils
yüklediyseniz (Ubuntu Desktop’a varsayılan olarak), anında "dönüştürebilir" ve aşağıdakilere yönlendirebilirsiniz grep
:
pdftotext my.pdf - | grep 'pattern'
Bu bir .txt dosyası oluşturmaz.
pdftotext
yazması gereken dosya adıdır . Ancak, kurallara göre, araçlar genellikle stdout
bir dosyaya yazarak dosya yerine yazmanıza olanak tanır -
. Benzer şekilde, stdout
böyle bir argümanı tamamen atlarsanız , bazı araçlar varsayılan olarak yazacaktır (ancak belirsizlik oluşturmadan bu her zaman mümkün değildir).
pdfgrep tam da bu amaçla yazılmıştır ve Ubuntu'da mevcuttur.
Çoğunlukla uyumlu olmaya çalışır grep
ve bu nedenle yalnızca PDF'ler için uzmanlaşmış olan "grep'in gücünü" sağlar. Bu --recursive
, --ignore-case
veya gibi genel grep seçeneklerini içerir --color
.
Bunun aksine pdftotext | grep
, pdfgrep bir eşleşmenin sayfa numarasını performansla gösterir ve genellikle tüm dokümanı aramak zorunda olmadığında daha hızlı olur (örneğin --max-count
veya --quiet
).
Temel kullanım:
pdfgrep PATTERN FILE..
nerede PATTERN
arama dizesi ve bir FILE
(bir kabuk veya joker) dosya adları listesi.
Daha fazla bilgi için man sayfasına bakınız .
Hayır.
Bir pdf veri bölümlerinden, bazıları metinlerden, bazıları resimlerden ve bazıları gerçekten büyülü fantezi XYZ'den (örneğin .u3d dosyaları) oluşur. Bu topaklar çoğu zaman sıkıştırılmıştır (örneğin, düz, http://www.verypdf.com/pdfinfoeditor/compression.htm adresini kontrol edin ). 'Grep' .pdf için size sahip sıkıştırma aka ters metin ayıklayın.
Bunu dosya başına ya pdf2text
da sonuç gibi grep araçlarıyla yapabilirsiniz ya da .pdf dosyalarınızdan aranabilir bir dizin oluşturan bir 'indexer' ( xapian.org veya lucene'ye bakın ) çalıştırıp aramayı kullanabilirsiniz. Bu indeksleyicinin motor araçları pdf içeriğini almak için.
Ancak hayır, grep
pdf dosyalarını düzenleyemez ve önce metni çıkarmadan güvenilir cevaplar elde edemezsiniz .
pdfgrep
olduğu düşünüldüğünde (yukarıya bakın), düz bir "hayır" yanlıştır.
strings
İlk önce içinden geçirebilirsin : -
cat file.pdf | strings | grep <...etc...>
strings file.pdf | grep <...>
, ihtiyacınız yokcat
strings
Ya da çok kolay değil grep
.
PDF dosyalarında arama yapmayı destekleyen genel kaynak grep aracı crgrep'e bakın .
Ayrıca, arşivlerde bulunan içerik, veritabanı tabloları, görüntü meta verileri, POM dosya bağımlılıkları ve web kaynakları gibi diğer kaynakları ve yinelemeli arama dahil bunların kombinasyonlarını da aramanıza izin verir.
bunu dene
find /path -iname *.pdf -print0 | for i in `xargs 0`; do echo $i; \
pdftotext "$i" - | grep pattern; done
satırları yazdırmak için desen pdf içinde gerçekleşir
pdf dosyanızı içeren klasöre cd ve sonra
pdfgrep 'pattern' your.pdf
veya birden fazla pdf dosyasında arama yapmak istiyorsanız (örneğin, klasörünüzdeki tüm pdf dosyalarında)
pdfgrep 'pattern' `ls *.pdf`
veya
pdfgrep 'pattern' $(ls *.pdf)
ls
sadece yavaş değil, aynı zamanda kötü bir fikirdir . Sadece pdfgrep 'pattern' *.pdf
yeter
StackOverflow'ta yinelenen bir soru var. Orada insanlar harish.venkarts'ın bir türevini önerdi:
find /path -name '*.pdf' -exec sh -c 'pdftotext "{}" - | grep --with-filename --label="{}" --color "your pattern"' \;
Buradaki benzer cevaba göre avantaj --with-filename
grep'in bayrağı. Standart grep daha fazla özelliğe sahip olduğundan, bu da pdfgrep'den daha üstündür.
https://stackoverflow.com/questions/4643438/how-to-search-contents-of-multiple-pdf-files
Diyelim ki tp'yi diske dönüştürmüyorsunuz, onları dönüştürebilir stdout
ve sonra onu grep edebilirsiniz pdftotext
. PDF'yi herhangi bir dönüşüm olmadan yapmak PDF
, çoğunlukla ikili bir format olduğu için pratik bir yaklaşım değildir .
Dizinde:
ls -1 ./*.pdf | xargs -L1 -I {} pdftotext {} - | grep "keyword"
veya dizinde ve alt dizinlerinde:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} pdftotext {} - | grep "keyword"
Ayrıca, bazı pdf
taramalar nedeniyle , önce OCR yapılması gerekir. grep
Ed edilemeyen tüm pdfs'leri ve OCR'ları aramak için oldukça basit bir yol yazdım .
Bir pdf
dosya herhangi bir yazı tipine sahip değilse, genellikle aranamadığını fark ettim . Yani bunu bilerek kullanabiliriz pdffonts
.
İlk 2 satır pdffonts
tablo başlığıdır, yani bir dosya aranabilir olduğunda ikiden fazla satır çıktısı varsa, bunu yaratabileceğimizi bilerek:
gedit check_pdf_searchable.sh
sonra bunu yapıştırın
#!/bin/bash
#set -vx
if ((`pdffonts "$1" | wc -l` < 3 )); then
echo $1
pypdfocr "$1"
fi
sonra çalıştırılabilir yap
chmod +x check_pdf_searchable.sh
sonra aranamayan tüm pdfs'leri dizinde listele:
ls -1 ./*.pdf | xargs -L1 -I {} ./check_pdf_searchable.sh {}
veya dizinde ve alt dizinlerinde:
tree -fai . | grep -P ".pdf$" | xargs -L1 -I {} ./check_pdf_searchable.sh {}
Yalnızca pdf adlarını / özelliklerini ... veya sıkıştırılmış veya kodlanmamış basit dizeleri aramak istiyorsanız strings
, aşağıdakileri kullanabilirsiniz:
grep -a STRING file.pdf
cat -v file.pdf | grep STRING
Kimden grep --help
:
--binary-files=TYPE assume that binary files are TYPE;
TYPE is 'binary', 'text', or 'without-match'
-a, --text equivalent to --binary-files=text
ve cat --help
:
-v, --show-nonprinting use ^ and M- notation, except for LFD and TAB