任意のディレクトリからファイルを見つける方法


22

Book1というファイルを探しています。

私のテストでは、前述のファイルを探していますが、このテストでは、そのファイルがどこにあるのかわかりません。

試しましfind / -iname book1たが、出力はありません。

ファイルの場所がわからない場合、コマンドラインを使用してbook1というファイルを見つけるにはどうすればよいですか?

編集:

私のシナリオは以下でより詳細に説明されています:

  1. ファイル拡張子は不明です
  2. 正確な名前(大文字、小文字、数字など)は不明です
  3. ファイルの場所は不明です

2
というファイルがあり、Book1読み取り可能なディレクトリにある場合は、それfind / -iname book1を見つけます。実際Book1にそうなのBook1.xyzか、そうではないのか?
フォックス

ファイルの完全な名前はBook1.gnumericです。ファイルの名前全体を指定する必要があると言っていますか?何らかの理由で、この特定のコマンドでは、必要なのはファイルの一般名だけだと思いました。たとえば、ファイル拡張子を思い出せず、探しているファイルの名前しかわからない場合、テストはファイルを見つけようとします。お知らせ下さい。
-Aspire27

@don_crisstiできました。上記の編集をご覧ください。
Aspire27

あなたはミキシングfind locatelocateは寛大で、通常は毎日更新されるデータベース内にある限り、一致するものをすべて見つけます。find、この場合は、で使用するパターンの一種であるファイルグロブを探していますls。あなたはおそらく意味しiname '*book1*'ます。シェルがそれfindを見る前に展開するのを止めるために、パターンは引用符の中になければならないことに注意してください。またfind、多くの* nixコマンドと同様に、失敗するとイライラするほど静かになります。
マンゴー

回答:


31

まず、への引数-inameはシェルパターンです。パターンの詳細については、Bashのマニュアルを参照してください。要点は、find実際にファイルを見つけるために、ファイル名が指定されたパターンに一致する必要があるということです。大文字と小文字を区別しない文字列をbook1一致させるには、次のようBook1.gnumericに追加する*必要があります。

find / -iname 'book1*'

またはフルネームを指定します:

find / -iname 'Book1.gnumeric'

第二には、-inameようになりますfindあなたが指定したので、もしファイル名の大文字小文字を無視-iname book1しても見つけるかもしれないBook1bOok1あなたは確信している場合は、あなたが探しているファイルが呼び出されるなどBook1.gnumeric 、その後使用していない-inameけど-name、それは速くなります:

find / -name 'Book1.gnumeric'

第三に、他の回答で述べたようにパターンを引用することを覚えておいてください。

最後に、システム上のあらゆる場所でファイルを探したいと思い ますか?探しているファイルが実際に$HOMEディレクトリ内にあるか、どこかでダウンロードした場合は、そのディレクトリにある可能性があります。繰り返しますが、それははるかに高速かもしれません。

編集

あなたが質問を編集したことに気付きました。完全なファイル名、大文字、場所がわからない場合は、次のようなものを使用する必要があります。

find / -iname 'book1*'

また、非ルートユーザーとして呼び出した場合2>/dev/nullに表示されるすべて*permission denied*のエラーやその他のエラーを隠すために、行の最後に置くことをお勧めしfindます。

find / -iname 'book1*' 2>/dev/null

そして、あなたが単一のファイルを探していることを確信しており、あなたのシステムに単一のファイルだけが基準に一致する場合find、最初に一致するファイルを見つけた後に終了するように指示できます:

find / -iname 'book1*' -print -quit 2>/dev/null


6

locateコマンドを試すことができます。ファイル名のデータベースを使用して、検索を高速化します。

一致するすべてのファイルを検索*book1*し、大文字と小文字を無視するには、次を使用できます。

locate -i book1

あなたがファイルを検索したい場合は起動してbook1、あなたのワイルドカードを自分で行う必要があります。

locate -i 'book1*'

これは、よりもはるかに高速ですfindが、データベースが最後に更新されたときと同じくらい最新です。


5

というファイルがあることがわかっている場合book1.something、ファイルの場所、正確な値something、およびファイル名の大文字パターンはすべて不明です。

find / -iname 'book1.*'

確実にわかっているのが、ファイル名にwordが含まれているbookことだけである場合は、次のように、はるかに大きなリストを生成できます。

find / -iname '*book*'

への引数-nameはシェルglobパターンです。ファイルがあるディレクトリから、以下を比較します。

$ ls Book1
ls: cannot access 'Book1': No such file or directory
$ ls Book1.*
Book1.gnumeric

これは、によって実行される検索の種類を表し-nameます。この-inameオプションは、大文字と小文字を区別しないこのバージョンを許可します。


1

POSIXly、

LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'

名前に含まれるすべてのファイルのパスを報告しますbook1(例いずれかのバリエーションで、唯一のASCIIラテン文字考慮bokBOKのようにUnicodeではなく、他の多くのバリエーションを𝗄𝚔𝘬およびそれらのすべてのバリエーション...発音区別記号付き)で読み取りアクセス権があるすべてのディレクトリ。


0

これらの種類のタスクでは、私はいつもやる: find / -iregex '.*Book1.*'

このフォームは、シナリオの3つのポイントを処理します(iregex大文字と小文字を区別しない合理的な表現であり、.*両側のパターンは、Book1の固定パターンの前後の任意の文字に一致します-これは明らかに、必要以上の結果を返す可能性がありますしかし、あなたはファイルを見逃さないことを確信しています)

主な違い:可能な場合は、単に使用するよりも限定的/にのみ試みるように、/homeそうでない場合は、あなたが関連していないいくつかのディレクトリに降ります、またはそう(/sys/devなど...)

ただし、Unixのアクセス許可が適用されることに注意してください。findコマンドを実行しているユーザーがアクセス(実行)権限を持たないディレクトリにファイルがある場合、そこにファイルfindを見つけることができません。


iregexは、Solaris(OSが指定されていない)(および場合によっては* BSD)のような場所では動作しません。GNU拡張機能であり、標準のfind
Gert van den Berg

0

Silver Searcherは、ファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。

問題を解決するには、シルバーサーチャーコマンドは次のようになります...

ag -g Book1

-g PATTERN PATTERNに一致するファイル名を出力


0

locate そしてその変形は高速な方法である傾向があります。

# updatedb # run as root, possibly using sudo, e.g. sudo -b updatedb. If file is on the system for more than a day it should already be in the index and this can be skipped
$ locate -i book1

Locateが使用できない場合は、find代わりに使用できます。かなり遅くなる傾向がありますが、より正確です。

単一のパーティションがある場合:(ユーザーがファイルにアクセスできない場合は、rootとして実行します)

$ find / -xdev -iname 'book1*' -print # If the iname extension to find is available
$ find / -xdev -print | grep -F -i /book1 # if iname is not available

あなたは含まれていない場合は-xdev find検索し、他のパーティション上のもの、のように/procして/sysroot以外で操作している場合は特に、エラーで画面をあふれさせる傾向があり、。(エラー2> /dev/nullは、findコマンドの最後に追加することで非表示にできます(コメントは削除する必要があります))

複数のパーティションがあり、ファイルがどのパーティションにあるかわからない場合は、リストを取得してlsblk(LinuxベースのOSではdfそうでなければ出力の解析がオプションです)、findにフィードできます:ファイルにアクセスできるかどうかわからない)

$ find $(lsblk -O MOUNTPOINT -n | grep -F /) -xdev -iname 'book1*' -print # GNU-based OSes
$ find $(df -P|awk '$1 ~ /^\/dev/ {print $NF}') -xdev | grep -F -i book1 # Non-GNU based OSes.

(これは、マウントポイントにスペースが含まれている場合は少し壊れやすいです)(dfパラメーターの調整が必要な場合があります。-Pは、GNU dfに標準POSIX出力を提供します。

grep -F除外他のものは、スワップパーティションのように、返されました。

GNU以外のバージョンでは、awkはマウントのあるデバイスを見つけて/dev実際のファイルシステムを取得し、df出力から最後のフィールド(マウントポイント)を出力します。

また、これは、ボーンのようなシェルを想定し(kshbash動作するはずです。あなたが使用している場合はcshバリアントを、起動スクリプト可能なシェルをあなたはこれを試す前に)


grepSは、ビット騒々しいかもしれない、それをフィルタリングする方法を学び 、より良い(これは一例で必要とするべきではありませんが、それが検索され、より一般的なものであれば、grepするには、下のノイズレベルを維持するためにチューニングが必要になります)
ゲルトヴァンデンバーグ

0

ag(シルバーサーチャー)はファイル内の非常に高速な検索を提供し、ファイル名を検索するオプションもあります。

>: time ag -g foo # uses heuristics to only look in desired locations
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m0.884s
user    0m0.701s
sys     0m0.178s

>: time find . -name "*foo*"
./apps/ssr/dist/static/media/foo-illustration.jpg
./apps/vxy/dist/static/media/foo-illustration.jpg
./apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m29.744s
user    0m2.108s
sys     0m13.982s

>: time ag -ug foo # searching all files is still faster and simpler to use then find command
apps/ssr/dist/static/media/foo-illustration.jpg
apps/vxy/dist/static/media/foo-illustration.jpg
apps/vxy/src/assets/tree-content-pages/tree-page-bird/foo-illustration.jpg

real    0m16.698s
user    0m1.951s
sys     0m7.119s

そのため、ここでの使用例では、ファイルがagによって無視されるファイルでない場合、30倍以上高速です。

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