回答:
あなたが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'
(そのままで拡張正規表現です)。
ここでは、標準のワイルドカードを使用する方が簡単です。
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)
はksh93
regexpと同等ですz{x,y}
。~(i:...)
:大文字と小文字を区別しないマッチング。Globsにはfind
、並べ替えられたリスト(glob修飾子zsh
を使用して並べ替えを無効にするoN
か、別の並べ替え基準を使用できます)があり、ファイル名に有効な文字を形成しないバイトのシーケンスが含まれている場合にも機能するという点で、ここより優れた利点があります(インスタンスは、UTF-8文字セットを使用してロケールで、find
アプローチが報告しないだろう$'St\xE9phane Chazelas - CV.pdf
というよう\xE9
な文字が正規表現にマッチしていないではないされている.
か、ワイルドカード?
または*
GNUでfind
)。
shopt -s dotglob globstar; printf '%s\n' ~/**/*???.[pP][dD][fF]
あなたが求めない限り、あなたはしません。確かに、私は知識を深めていますが、名前にが含ま.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ファイルを命名含まれるように工夫することにより仕上げてみましょう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
スレッドのERまで。ただし、これはこの質問の範囲外です。私もまっすぐな顔で書いた。なぜ私はそんなに気にするのですか?映画や音声ファイルを探しているかもしれません。または特定の種類の写真。またはプロジェクトデータディレクトリ内のバイナリ実行可能ファイル。
.pdf
、そして、あなたの衒学はあまり理解されるであろう。しかし、これは比較的珍しい状況であり(あなたの仕事にもかかわらず)、質問者が実際に対処する必要があると信じる理由はありません。そのため、あなたがしていることは、有効であるとは気が散ります。そして、あなたがそれを語った力強い方法は、答えを「(おそらく)役に立たない」の領域に押しやると思います。(もちろん、私の意見のみです。)