任意のディレクトリからファイルを検索する方法

Book1

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

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

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

編集:

私のシナリオについて説明します詳細については、以下をご覧ください。

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

コメント

  • Book1、そしてそれがあなたが読むことができるディレクトリにあるなら、find / -iname book1はそれを見つけるでしょう。実際にはBook1であり、Book1.xyzではありませんか?
  • ファイルの完全な名前はBook1です。数値。ファイルの名前全体を指定する必要があると言っていますか?何らかの理由で、この特定のコマンドについて、’に必要なのはファイルの一般名だけだと思いました。たとえば、’ファイル拡張子を覚えておらず、ファイルの名前しかわからない場合、私のテストではファイルを見つけようとしています’ mを探しています。アドバイスしてください。
  • @don_crissti完了しました。上記の編集をご覧ください。
  • find locateを混在させています。 locateは寛大であり、通常は毎日更新されるデータベースにある限り、一致するものをすべて検索します。 findは、この場合、lsで使用するようなパターンであるファイルグロブを探しています。おそらくiname '*book1*'を意味します。 findがパターンを表示する前にシェルがパターンを展開しないようにするには、パターンを引用符で囲む必要があることに注意してください。また、findは、多くの* nixコマンドと同様に、失敗するとイライラするほど静かになることに注意してください。

回答

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

find / -iname "book1*" 

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

find / -iname "Book1.gnumeric" 

2番目、-inameではfindでファイル名の大文字と小文字が無視されるため、-iname book1を指定するとBook1bOok1などを検索します。探しているファイルの名前が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.shsudo locate -i "after.sh"sudo locate -i after.shsudo 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のみを考慮し、𝗄𝚔𝘬およびそれらのすべてのバリエーション(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(マウントポイント)。

これもボーンのようなシェル(kshbashが機能するはずです。 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].*" 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です