Book1 。
私のテストでは、前述のファイルを検索しようとしていますが、このテストでは、そのファイルがどこにあるのかわかりません。
find / -iname book1
を試しましたが、出力がありません。
わからない場合、コマンドラインを使用してbook1というファイルを見つけるにはどうすればよいですか。ファイルはどこにありますか?
編集:
私のシナリオについて説明します詳細については、以下をご覧ください。
- ファイル拡張子は不明です
- 正確な名前(大文字、数字など)は不明です
- ファイルの場所は不明です
コメント
回答
まず、-iname
への引数はシェルのパターンです。パターンの詳細については、 Bashマニュアルをご覧ください。要点は、find
が実際にファイルを検索するためには、ファイル名が指定されたパターンと一致する必要があるということです。大文字と小文字を区別しない文字列book1
をBook1.gnumeric
と一致させるには、*
を追加する必要があります。次のようになります:
find / -iname "book1*"
またはフルネームを指定します:
find / -iname "Book1.gnumeric"
2番目、-iname
ではfind
でファイル名の大文字と小文字が無視されるため、-iname book1
を指定するとBook1
、bOok1
などを検索します。探しているファイルの名前がBook1.gnumeric
次に-iname
を使用せずに-name
を使用すると、高速になります:
find / -name "Book1.gnumeric"
3番目に、その他の回答で述べられているパターンを引用することを忘れないでください。
最後に-システムのどこでもファイルを探したいと思いますか?探しているファイルが実際に$HOME
ディレクトリに取り組んだり、どこかからダウンロードしたりした場合。繰り返しますが、それははるかに高速かもしれません。
編集:
気づきました質問を編集したこと。完全なファイル名、大文字、場所がわからない場合は、次のようなものを使用する必要があります。
find / -iname "book1*"
は、*permission denied*
およびfind
を呼び出した場合に発生するその他のエラーをすべて非表示にします。 root以外のユーザー:
find / -iname "book1*" 2>/dev/null
そして、「確実に」単一のファイルを探していて、ファイルが1つしかない場合条件に一致するシステムは、最初に一致するファイルを見つけた後に終了するようにfind
に指示できます:
find / -iname "book1*" -print -quit 2>/dev/null
コメント
回答
locate
コマンドを試すことができます。ファイル名のデータベースを使用します。検索を高速化するため。
*book1*
に一致するすべてのファイルを検索し、大文字と小文字を区別しない場合は、
locate -i book1
book1
で始まるファイルを 検索する場合は、自分でワイルドカードを使用する必要があります:
locate -i "book1*"
find
よりもはるかに高速ですが、データベースが最後に更新されたときと同じくらい最新です。
コメント
- これらのいずれも出力を生成しませんでした:
locate -i after.sh
、sudo locate -i "after.sh"
、sudo locate -i after.sh
、sudo locate -i '*after.sh'
回答
book1.something
というファイルがあることがわかっている場合は、ファイルの場所、something
の正確な値、およびファイル名の大文字化パターンはすべて不明です。
find / -iname "book1.*"
ファイル名にの場合、
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
およびそれらのすべてのバリエーション(ASCIIを使用)…)読み取りアクセス権を持つすべてのディレクトリ。
回答
Zshではグロブパターンを使用できるため、これも機能します:
ls -a /**/book1
これによりbook1
というファイルが存在するすべての場所を検索します。
私のテストでは、これは
。また、root権限なしで実行した場合、ユーザー権限エラーはほとんどまたはまったく発生しません
手動。
回答
この種のタスクでは、常に次のように行います:find / -iregex ".*Book1.*"
このフォームはシナリオの3つのポイントを処理します(iregex
は大文字と小文字を区別しない合理的な表現であり、両側の.*
は、Book1の固定パターンの前後の任意の文字と一致します。これにより、明らかに必要以上の結果が返される可能性がありますが、ファイルを見逃すことはありません)
主な違い:可能であれば、/
のみを試すなど、/
を使用するよりも制限を厳しくします。それ以外の場合は、関連性のないいくつかのディレクトリ(/sys
、/dev
など)に移動します
ただし、次の点に注意してください。 Unixの許可適用:find
コマンドを実行しているユーザーがアクセス(実行)権を持たないディレクトリにファイルがある場合、find
はそこにそれを見つけることができません。
コメント
- iregexは’のような場所では機能しませんSolaris(OSは指定されていません)(およびおそらく* BSD)、これはGNU拡張であり、標準
find
回答
シルバーサーチャーは、ファイルやコンテンツを検索するための非常に高速で便利なユーティリティです。
問題を解決するには、silversearcherコマンドは次のようになります…
ag -g Book1
-g PATTERN
パターンに一致するファイル名を出力
回答
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
検索する場合利用できませんlableでは、代わりに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
は
と/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
出力からのd(マウントポイント)。
これもボーンのようなシェル(ksh
とbash
が機能するはずです。 csh
バリアントを使用している場合は、これを試す前にスクリプト可能なシェルを起動してください)
コメント
-
grep
は少しうるさいかもしれません、フィルタリングする方法を学ぶ より良い(これは例では必要ありませんが、より一般的なものである場合は、grepsノイズレベルを低く抑えるために調整が必要です)
回答
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
Soここでの私の使用例では、ファイルがagによって無視されるファイルでない場合、30倍以上高速です。
回答
find / -type f -iname "book[0-9].*"
Book1
、そしてそれがあなたが読むことができるディレクトリにあるなら、find / -iname book1
はそれを見つけるでしょう。実際にはBook1
であり、Book1.xyz
ではありませんか?find
とlocate
を混在させています。locate
は寛大であり、通常は毎日更新されるデータベースにある限り、一致するものをすべて検索します。find
は、この場合、ls
で使用するようなパターンであるファイルグロブを探しています。おそらくiname '*book1*'
を意味します。find
がパターンを表示する前にシェルがパターンを展開しないようにするには、パターンを引用符で囲む必要があることに注意してください。また、find
は、多くの* nixコマンドと同様に、失敗するとイライラするほど静かになることに注意してください。