web-dev-qa-db-ja.com

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

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

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

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

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

編集:

私のシナリオを以下で詳しく説明します。

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

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

find / -iname 'book1*'

またはフルネームを指定してください:

find / -iname 'Book1.gnumeric'

次に、-inamefindでファイル名の大文字と小文字を区別しないため、-iname book1を指定すると、Book1bOok1なども検出される可能性があります。あなたが探しているファイルはBook1.gnumericと呼ばれ、-inameを使用しないでください。ただし、-nameの方が高速です。

find / -name 'Book1.gnumeric'

3番目に、- その他の回答 で述べられているパターンの引用について覚えておいてください。

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

[〜#〜]編集[〜#〜]

質問を編集したようです。完全なファイル名、大文字、場所がわからない場合は、次のようにします。

find / -iname 'book1*'

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

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

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

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

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

*book1*に一致するすべてのファイルを検索し、大文字と小文字を区別しない場合は、

locate -i book1

ファイルを検索したい場合starting with book1自分でワイルドカードを実行する必要があります:

locate -i 'book1*'

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

6
James K

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

find / -iname 'book1.*'

ファイル名にWord bookが含まれていることが確実にわかっている場合は、次のコマンドではるかに大きなリストを生成できます。

find / -iname '*book*'

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

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

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

5
Fox

POSIXly、

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

名前にbook1が含まれるすべてのファイルのパスを報告します(大文字小文字のバリエーションはありますが、ASCIIラテン文字bokBOKのみを考慮し、他の多くのバリエーションは考慮しません) ????????????などのUnicodeと、発音区別符号付きのすべてのバリエーション...)読み取りアクセス権を持つすべてのディレクトリ。

1

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倍以上速くなります。

0
tomtt

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

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

ag -g Book1

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

0
qoomon

これらの種類のタスクについては、私は常に行います:find / -iregex '.*Book1.*'

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

主な違い:可能であれば、/だけを使用するなど、/homeだけを使用するよりも制限を強化します。そうしないと、関連しない一部のディレクトリ(/sys/devなど...)

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

0
Patrick Mevzek

Zshではグロブパターンを使用できるため、これも機能します。

ls -a /**/book1

これにより、book1というファイルが存在するすべての場所が検索されます。

私のテストでは、これはfindを使用するよりも高速であるように見えます。また、root権限なしで実行すると、ユーザー権限エラーはほとんど発生しません

manual を参照してください。

0
smac89
find /  -type f -iname "book[0-9].*" 
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/sysなど)を検索します。これは、特にrootでない場合、画面にエラーが発生する傾向があります。 (エラーは、findコマンドの最後に2> /dev/nullを追加することで非表示にできます(コメントは削除する必要があります))

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

$ 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出力を与えます。他のバージョンには他のパラメーターがあるか、省略しておく必要がある場合があります。manページをお読みください)

grep -Fは、スワップパーティションなど、返される他のものを除外します。

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

これは、ボーンのようなシェルも想定しています(kshbashは動作するはずです。cshバリアントを使用している場合は、 scriptable Shell これを試す前に)

0