Book1というファイルを探しています。
私のテストでは、前述のファイルを探していますが、このテストでは、そのファイルの場所がわかりません。
私は試した find / -iname book1
ですが、出力はありません。
ファイルの場所がわからない場合、コマンドラインを使用してbook1というファイルをどのように見つけますか?
編集:
私のシナリオを以下で詳しく説明します。
まず、-iname
の引数はシェルpatternです。パターンについての詳細は Bashマニュアル で読むことができます。要点は、find
が実際にfindファイルになるためには、ファイル名が指定されたパターンと一致する必要があるということです。大文字と小文字を区別しない文字列book1
をBook1.gnumeric
に一致させるには、次のように*
を追加する必要があります。
find / -iname 'book1*'
またはフルネームを指定してください:
find / -iname 'Book1.gnumeric'
次に、-iname
はfind
でファイル名の大文字と小文字を区別しないため、-iname book1
を指定すると、Book1
、bOok1
なども検出される可能性があります。あなたが探しているファイルは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
locate
コマンドを試すことができます。ファイル名のデータベースを使用して、検索を高速化します。
*book1*
に一致するすべてのファイルを検索し、大文字と小文字を区別しない場合は、
locate -i book1
ファイルを検索したい場合starting with book1
自分でワイルドカードを実行する必要があります:
locate -i 'book1*'
これはfind
よりもはるかに高速ですが、データベースが最後にリフレッシュされたときと同じくらい最新のものです。
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
オプションは、これの大文字小文字を区別しないバージョンを単に許可します。
POSIXly、
LC_ALL=C find / -name '*[bB][oO][oO][kK]1*'
名前にbook1
が含まれるすべてのファイルのパスを報告します(大文字小文字のバリエーションはありますが、ASCIIラテン文字bokBOK
のみを考慮し、他の多くのバリエーションは考慮しません) ????
、????
、????
、ᵏ
、ₖ
、K
、k
などのUnicodeと、発音区別符号付きのすべてのバリエーション...)読み取りアクセス権を持つすべてのディレクトリ。
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倍以上速くなります。
Silver Searcher は、ファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。
問題を解決するために、シルバーサーチャーコマンドは次のようになります...
ag -g Book1
-g PATTERN
PATTERNに一致するファイル名を出力します
これらの種類のタスクについては、私は常に行います:find / -iregex '.*Book1.*'
このフォームはシナリオの3つのポイントを処理します(iregex
は大文字と小文字を区別しない有理式であり、両側に.*
を含むパターンはBook1の固定パターンの前後の任意の文字に一致します-これは明らかに必要以上の結果を返す可能性がありますが、ファイルを見逃さないようにしてください)
主な違い:可能であれば、/
だけを使用するなど、/home
だけを使用するよりも制限を強化します。そうしないと、関連しない一部のディレクトリ(/sys
、/dev
など...)
ただし、UNIXの権限が適用されることに注意してください。ファイルがfind
コマンドを実行しているユーザーにアクセス(実行)権限がないディレクトリにある場合、find
はそのファイルを見つけることができません。
Zshではグロブパターンを使用できるため、これも機能します。
ls -a /**/book1
これにより、book1
というファイルが存在するすべての場所が検索されます。
私のテストでは、これはfind
を使用するよりも高速であるように見えます。また、root権限なしで実行すると、ユーザー権限エラーはほとんど発生しません
manual を参照してください。
find / -type f -iname "book[0-9].*"
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
出力から最後のフィールド(マウントポイント)を出力します。
これは、ボーンのようなシェルも想定しています(ksh
とbash
は動作するはずです。csh
バリアントを使用している場合は、 scriptable Shell これを試す前に)