LinuxでPDFファイルを検索するfindコマンド


11

私の目標は、リモートマシン上のすべてのPDFファイルを見つけることなので、便利なコマンドを使用しfindます。だから私は

〜* .pdfを見つける
または
〜 "* .pdf"を検索
そして私は何も得ません。私は自分のマシンでも同じことをしていますが、何も起こりません。マシンのメニューから定期的に検索を行ったところ、かなりの数のpdfファイルが見つかりました。誰かが私が間違っていることを教えてくれませんか?


11
良い回答が必要な場合は、否定的な意見を質問の外側に置いてください。関連するストーリーでfindは、役に立たないことはありません。
ヴィルヘルムテル、

8
もちろん、あなたには言論の自由の権利があります。しかし、あなたは良い反応を望んでいますよね?いいえ、あなたには良い建設的な反応をする権利がありません。それは特権です。
ヴィルヘルムテル、

2
悪い職人はいつも自分の道具のせいです。つまり、ここでは純粋なPBCAKです。
Pascal Thivent、2010年

5
@Wilhelmtell、私はマーティンのステートメントは公平だと思います-コマンドは、最初は「find」という名前にするべきではありませんでした。「walkpath_and_execute」のようなものです...最も直感的またはユーザーフレンドリーなインターフェースはなく、はるかに多くのことを行います単にファイルを見つけるよりも。単純な名前「find」は、それが持っていない単純なインターフェースを示唆しているという点で不正です。確かに、検索がはるかに役に立たないからであると非常によく動作しますが、一つはほとんど「その」など、「探し」、「見つける」との違いを知らないため、初心者を責めることはできない
マイケル・アーロンSafyan

1
@マイケル私はここで誰も非難しませんでした。むしろ、私はここで非難を行ったのは私ではありませんでした。find直感的だとは言いませんでした。私はおそらくより良い口調で同じことを言うことができたでしょう。時々私は(ばかげた)否定的なコメントに反応します。
ヴィルヘルムテル

回答:


30

findまったく役に立たない。あなたはそれを適切に使用していないだけです。

試してください:

find . -type f -iname '*.pdf'


@Martin-喜んでお手伝いします。質問に回答済みのマークを付けてください。
ミッチデンプシー、

@stepanchegはい、インターネットを停止してハードコピーを印刷してみませんか。
ボボボボ

9

findutilsのドキュメントをご覧くださいfindコマンドは、信じられないほど強力なものであると、結果的に、やや複雑なインターフェースを持っています。あなたはあなたが望むことをすることができます:

find . -type f -iname '*.pdf' 

上記のコマンドは、「*。pdfに一致する大文字と小文字を区別しない名前のファイルタイプのエントリを。findコマンドを実際に使用して、見つかったファイルに対してコマンドを実行できます(ファイル名を印刷する代わりに、またはそれに加えて)。ただし、目的に応じて、locateコマンドを使用すると快適になります。updatedbを使用してLocateデータベースを構築したとすると、ファイルの検索が非常に簡単になります。例えば:

locate '*.pdf'

また、locateはファイル名のインデックス(locateデータベース)を使用するため、locateコマンドは通常findコマンドよりも高速ですが、findは各呼び出しの階層をたどります。


6

何を検索しているのかを示す述語が欠けているだけです(例:)-name

名前でホームディレクトリを検索するには:

find ~ -name \*.pdf

ワイルドカード*はエスケープする必要があるので、findがワイルドカードを取得する前にシェルが解釈しないように注意してください。'*.pdf'および"*.pdf"を使用すると、と同じ効果があり\*.pdfます。

大文字と小文字を区別せずに検索するには:

find ~ -iname \*.pdf

結果のみをファイルにプルーニングするには(名前式はおそらくこれを処理しますが、奇妙な名前のディレクトリがある場合に備えて):

find ~ -type f -iname \*.pdf

findがシンボリックリンクに従っていることを確認するには(通常、検索時に自分で行います):

find ~ -follow -type f -iname \*.pdf

見つけたファイルを使って何かを行うには:stdoutリダイレクションを使用してこれをファイルにダンプ(たとえば> filename、最後に-exec追加)するか、オプションを使用してコマンドを実行します(詳細はmanページを参照)。ただし、後者は各ファイルに対して一度にコマンドを実行します。多くの場合、xargsコマンドに、見つかったファイルを引数として別のコマンドにすべて一度に渡すか、一度に大きなチャンクを渡す方が高速です。たとえば、ヘッダーファイルを介したアドホック(ただしインデックス付けされていない)grepsの場合:

find ~ -follow -type f -name \*.h | xargs grep -nH "identifier"

そして最後の1つの拡張子は、ファイルとディレクトリにスペースが含まれている場合に、最後のコマンドが正しく機能するようにするためです。

find ~ -follow -type f -name \*.h -print0 | xargs -0 grep -nH "identifier"

実際、現在のディレクトリに.pdfで終わるファイルがある場合、「*。pdf」は展開されますよね?(マイナーノート)
Peter Jaric

1
バッシュではありません。bashマニュアルから:「二重引用符で文字を囲むと、[ドル]、[バッククォート]、[パイプ]を除くすべての文字のリテラル値が保持されます。また、履歴の拡張が有効になっている場合は[バング]が保持されます。 」自分で確認してみてください:テキストファイルが含まれているディレクトリのls "* .txt"。
オーウェンS.

はい、もちろんそうです。どこからそのアイデアを得たのかわかりません。私を訂正してくれてありがとう。
Peter Jaric


0

以前はfindとgrep likeを組み合わせていました

見つける。| grep -i ".pdf"

多分最高の効率ではありませんが、それは仕事をうまく行います。


これは、中に行うことができるfindあなたが望んだ場合を経由して、直接-iregexfind ~ -iregex '.*\.pdf'。問題は、findパターンは常に^前面と$背面にa があるように扱われるため、パターンをもう少し複雑にする必要があることです。また、注意:.パターンでは、実際には1文字のワイルドカードであり、リテラルのピリオドではありません。
オーウェンS.

0

過去x日以内にダウンロードが必要なファイルを見つける

find ~ -type f -iname '*.pdf' -mtime -1

大文字と小文字に関係なく~拡張子が付いたホームディレクトリ以下のpdfファイル.pdf(つまり、iが入っているiname)が見つかり、追加したので最大1日前に変更されmtime -1ます。mtimeに-60を指定すると、最後の60日間になります。


0

「見つかった」ファイル内で検索を実行するには、次の構成があります。

find <dir> -type f -iname <name> -exec grep -H <string> {} \;

execコマンドは、エスケープされた「;」で終了する必要があります -Hは、grepがファイル内の「string」の行に加えてファイルパスを出力するために必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.