名前に3文字以上のPDFをすべて検索します


9

名前(拡張子を除く)が3より大きいPDFファイルを見つけたいのですが。

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

何も返しませんが、

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

動作します。

{3,}バリアントを有効にするにはどうすればよいですか?


長さは?ファイル名の長さ?ページの長さ?
Ignacio Vazquez-Abrams

回答:


18

あなたがGNUを使用していると仮定しますfind(あなたはおそらくPOSIX-iregexへのGNU拡張であるので、あなたはそうです)、そして認識しないEmacs正規表現にデフォルトで設定します。オプションを使用して、異なるタイプの正規表現を指定する必要があります。さらに、正規表現がフルパスと一致するように正規表現を調整する必要があります。find-regex-iregex{3,}-regextype

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

また、.「。」と一致するようにをエスケープする必要があります。文字ではなく:

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

「/」以外の3つの文字しか気にしないため、正規表現を簡略化できます。

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'

(そのままで拡張正規表現です)。


20

ここでは、標準のワイルドカードを使用する方が簡単です。

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

または、いくつかのfind実装(サポートするサポート-regexもサポートするもの-iname):

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

文字の任意の数字のために代わりに3、あなたがに戻すことを好むかもしれところだという-iregex利用可能な場合(参照@Stephen・キットの答えを)か、使用できzshまたはksh93グロブ:

  • zsh

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

    (の(D)ように隠しファイルと隠しディレクトリ内のファイルを考慮するfind

    • (#cx,y)zsh正規表現に相当するワイルドカードです{x,y}
    • (#i) 大文字と小文字を区別しない
    • ?任意の1文字の標準ワイルドカード(regexpなど.
    • **/:任意のレベルのサブディレクトリ(0を含む)
  • ksh93

    FIGNORE='@(.|..)' # to consider hidden files
    set -o globstar
    printf '%s\n' **/{3,}(?).~(i:pdf)
    
    • @(x|y):regexpと同様の拡張kshワイルドカード演算子(x|y)
    • FIGNORE:グロブによって無視されるファイルを制御する特別な変数。設定すると、隠しファイルの通常の無視は行われませんが、存在する...ディレクトリのエントリは無視します。
    • {x,y}(z)ksh93regexpと同等ですz{x,y}
    • ~(i:...):大文字と小文字を区別しないマッチング。

Globsにはfind、並べ替えられたリスト(glob修飾子zshを使用して並べ替えを無効にするoNか、別の並べ替え基準を使用できます)があり、ファイル名に有効な文字を形成しないバイトのシーケンスが含まれている場合にも機能するという点で、ここより優れた利点があります(インスタンスは、UTF-8文字セットを使用してロケールで、findアプローチが報告しないだろう$'St\xE9phane Chazelas - CV.pdfというよう\xE9な文字が正規表現にマッチしていないではないされている.か、ワイルドカード?または*GNUでfind)。


これはBashで機能しますか?shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
wjandrea 2018年

7

PDFであることを確認するにはどうすればよいですか?

あなたが求めない限り、あなたはしません。確かに、私は知識を深めていますが、名前にが含ま.pdfれているファイルについて質問していません。.pdfファイル名に文字が含まれているからといって、PDFファイルにはなりません

実際には、のは、このことについて、すべての-ウェイ知識をひけらかすことしてみましょう:ファイル名の最後の4つの文字がある場合.pdf、その後、それは常にその名前で3文字以上を持つことになります

したがって、これを間違った方法で行うと、次のようになります。

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

その二番目を見てください?実際には実行可能ファイルです。(わかっています。名前を変更しました。)そして、Documentsディレクトリにあると誓ったPDFも見当たりません。

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

したがって、使用-inameするとその1つを見つけることができますが、それでもこのnot-a-PDFファイルが表示されます。

この場合に本当にやりたいことは、コマンドを使用してファイルのマジックナンバーを調べることですfile。1つのオプションは、解析が簡単な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その部分をゼロにして結果を出力してみましょう。注意してください。私のファイルの1つには名前にコロンが含まれています。だからawkにを頼むことはできません($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ファイルを命名含まれるように工夫することにより仕上げてみましょうaabc

$ 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スレッドのERまで。ただし、これはこの質問の範囲外です。私もまっすぐな顔で書いた。なぜ私はそんなに気にするのですか?映画や音声ファイルを探しているかもしれません。または特定の種類の写真。またはプロジェクトデータディレクトリ内のバイナリ実行可能ファイル。


1
場合アスカー名前で終わらないPDFファイルがあるあなたが行うのと同じような状況を、持っている.pdf、そして、あなたの衒学はあまり理解されるであろう。しかし、これは比較的珍しい状況であり(あなたの仕事にもかかわらず)、質問者が実際に対処する必要があると信じる理由はありません。そのため、あなたがしていることは、有効であるとは気が散ります。そして、あなたがそれを語った力強い方法は、答えを「(おそらく)役に立たない」の領域に押しやると思います。(もちろん、私の意見のみです。)
デビッドZ

私たちは知識を深めているので、PoC || GTFOポリグロットなどのPDFをどのように処理しますか?
スティーブンキット2018年

@StephenKitt-あなたが何を求めているのかわからないが、私は興味をそそられます。それらは、私には普通のPDFのように見えますが、特にファンキーな名前はありません。これらは私の提案する解決策に失敗しますか?
リッチ

@DavidZ何を言ったらいいのかわからない。つまり、私がすでに多くのことを言っているときに、私が知識を持っていることを指摘することは、少し知識を深めていませんか?これが「役に立たない」理由は次のとおりです。PDFを見つけるための優れたソリューションは、スクリプト、バイナリ実行可能ファイル、ライブラリ、メディアファイルなどを見つけるための適応可能なソリューションである必要があります。 「圧縮されたマッハ実行可能ファイル」に対する他の答えですが、私は学ぶつもりです。
リッチ

1
@Rich多くのPDFもZIPファイルであり、一部は画像でもあり、起動可能な仮想マシンでもあります...(ヒントについては、最初のいくつかの問題の「ネタバレ」リンクを参照してください。残りはPDF自体に記載されています。)
スティーブンキット2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.