ファイル、ディレクトリ、テキスト内容などを検索するコマンドです。
指定した条件に一致するファイルやディレクトリを検索します。
| 構文/オプション | 説明 |
|---|---|
| find [path] -name [pattern] | 指定したパターンに一致する名前のファイルを検索 |
| find [path] -iname [pattern] | 大文字小文字を区別せずに名前で検索 |
| find [path] -type f | 通常ファイルのみを検索 |
| find [path] -type d | ディレクトリのみを検索 |
| find [path] -size [+/-]Nc | 指定したサイズのファイルを検索(N=サイズ、c=単位、+/-=より大きい/小さい) |
| find [path] -mtime [+/-]N | N日前に変更されたファイルを検索 |
| find [path] -user [username] | 指定したユーザーが所有するファイルを検索 |
| find [path] -perm [mode] | 指定した権限を持つファイルを検索 |
| find [path] -exec [command] {} \; | 検索結果の各ファイルに対してコマンドを実行 |
例:
find /home -name "*.txt" - /home以下の.txtファイルを検索find . -type f -size +10M - カレントディレクトリ以下の10MB以上のファイルを検索find /var/log -name "*.log" -mtime -7 - 過去7日以内に変更されたログファイルを検索find . -type f -name "*.jpg" -exec cp {} /backup/ \; - 全てのJPGファイルをバックアップディレクトリにコピーfind . -type f -empty - 空のファイルを検索find . -type f -perm 0777 -print - 777権限(すべてのユーザーが読み書き実行可能)のファイルを検索find . -type f -not -name "*.txt" -not -name "*.log" - テキストファイルとログファイル以外のファイルを検索find . -type f -name "*.log" -size +1M -exec ls -lh {} \; | sort -k5,5hr - 1MB以上のログファイルをサイズの大きい順に表示find . -type f -name "*.conf" -exec grep -l "DEBUG" {} \; - "DEBUG"という文字列を含む設定ファイルを検索find . -type f -mtime +30 -name "*.bak" -delete - 30日以上前のバックアップファイルを削除
事前に構築されたデータベースを使用して、ファイルやディレクトリを高速に検索します。
| オプション | 説明 |
|---|---|
| -i | 大文字小文字を区別せずに検索 |
| -l, --limit N | 結果の数をN個に制限 |
| -c, --count | 一致するファイルの数のみを表示 |
| -r, --regexp | 正規表現を使用して検索 |
| -S, --statistics | データベースの統計情報を表示 |
例:
locate "*.conf" - すべての.confファイルを検索locate -i "readme" - 大文字小文字を区別せずに"readme"を含むファイルを検索locate -c "*.jpg" - JPGファイルの数を表示sudo updatedb - locateデータベースを更新(検索前に実行すると最新の状態で検索可能)locate -r "\.mp4$" - 正規表現を使用してMP4ファイルを検索locate -l 10 "*.pdf" - 最初の10件のPDFファイルのみを表示locate -e "report" - 存在するファイルのみを表示(データベース更新後に削除されたファイルを除外)locate "*.log" | grep "/var/" | xargs ls -lh - /varディレクトリ内のログファイルの詳細情報を表示
注意: locateはデータベースを使用するため高速ですが、データベースは定期的に更新されるため、最近作成されたファイルは検索結果に含まれない場合があります。最新の状態で検索するには、sudo updatedbコマンドでデータベースを更新してください。
コマンドの実行可能ファイルがPATH環境変数のどこにあるかを表示します。
| オプション | 説明 |
|---|---|
| -a | PATHに含まれるすべての一致するファイルを表示(デフォルトでは最初の一致のみ) |
例:
which python - pythonコマンドの実行可能ファイルの場所を表示which -a python - すべてのpythonコマンドの実行可能ファイルの場所を表示which gcc g++ make - 複数のコマンドの場所を一度に表示which -a java | xargs ls -l - すべてのjavaコマンドの詳細情報を表示which $SHELL - 現在使用しているシェルの場所を表示
コマンドの実行可能ファイル、ソースコード、マニュアルページの場所を表示します。
| オプション | 説明 |
|---|---|
| -b | バイナリファイルのみを検索 |
| -m | マニュアルページのみを検索 |
| -s | ソースファイルのみを検索 |
例:
whereis ls - lsコマンドのバイナリ、ソース、マニュアルの場所を表示whereis -b python - pythonコマンドのバイナリファイルの場所のみを表示whereis -m gcc - gccコマンドのマニュアルページの場所のみを表示whereis -s bash - bashのソースファイルの場所のみを表示whereis -B /usr/bin -f ls - 特定のディレクトリ内でlsコマンドを検索for cmd in ls cp mv rm; do whereis $cmd; done - 複数のコマンドの場所を一度に表示
ファイル内のテキストパターンを検索します。テキスト処理コマンドセクションでも紹介していますが、ここではより詳細に説明します。
| オプション | 説明 |
|---|---|
| -i | 大文字と小文字を区別しない |
| -v | パターンに一致しない行を表示 |
| -n | 行番号を表示 |
| -r, -R | ディレクトリ内のファイルを再帰的に検索 |
| -l | パターンを含むファイル名のみを表示 |
| -c | パターンに一致する行数を表示 |
| -w | 単語全体が一致する場合のみ表示 |
| -E | 拡張正規表現を使用 |
| -F | パターンを固定文字列として扱う(正規表現を無効化) |
| -A n | 一致した行の後 n 行を表示 |
| -B n | 一致した行の前 n 行を表示 |
| -C n | 一致した行の前後 n 行を表示 |
| --color | 一致したテキストを色付きで表示 |
例:
grep "error" /var/log/syslog - ログファイル内の"error"を検索grep -i "warning" *.log - すべてのログファイル内の"warning"を大文字小文字を区別せずに検索grep -r "TODO" --include="*.py" . - カレントディレクトリ以下のPythonファイル内の"TODO"を再帰的に検索grep -v "^#" config.conf - コメント行(#で始まる行)を除外して表示grep -E "error|warning" log.txt - "error"または"warning"を含む行を検索grep -n "function" script.js - "function"を含む行と行番号を表示grep -o "IP: [0-9.]\+" server.log - IPアドレスのみを抽出して表示grep -A 2 -B 1 "ERROR" application.log - エラー行とその前後の行を表示grep -l "TODO" *.py | xargs wc -l - TODOを含むPythonファイルの行数を表示history | grep "git commit" - コマンド履歴からgitコミットコマンドを検索ps aux | grep "[n]ginx" - grepプロセス自体を除外してnginxプロセスを検索
ackとag(The Silver Searcher)は、プログラマー向けに最適化されたgrep代替コマンドです。
| コマンド/オプション | 説明 |
|---|---|
| ack [pattern] | カレントディレクトリ以下のファイルからパターンを検索 |
| ack --[language] | 特定の言語のファイルのみを検索 |
| ack -i | 大文字小文字を区別せずに検索 |
| ack -l | 一致するファイル名のみを表示 |
| ag [pattern] | ackと同様だが、より高速 |
| ag --ignore-dir=[dir] | 特定のディレクトリを無視 |
| ag --depth=[n] | 検索の深さを制限 |
例:
ack "function" - カレントディレクトリ以下のファイルから"function"を検索ack --js "setTimeout" - JavaScriptファイル内の"setTimeout"を検索ag "import" - カレントディレクトリ以下のファイルから"import"を高速に検索ag --python "def main" - Pythonファイル内の"def main"を検索ack -i "todo" --ignore-dir=vendor/ - vendorディレクトリを除外して大文字小文字を区別せずにTODOを検索ack -w "log" --type=ruby - Rubyファイル内の"log"という単語のみを検索(部分一致を除外)ag -G "\.java$" "public class" - Javaファイル内の"public class"を検索ag -l "TODO|FIXME" | xargs wc -l - TODOまたはFIXMEを含むファイルの行数を表示ag --count "import" --sort-files - 各ファイル内の"import"の出現回数をファイル名順に表示
注意: ackとagはデフォルトでバージョン管理システムのディレクトリ(.git, .svnなど)や一時ファイルを無視し、テキストファイルのみを検索します。これにより、grepよりも効率的にコードを検索できます。
findとgrepを組み合わせることで、特定のファイルタイプ内のテキストを検索できます。
例:
find . -name "*.py" -exec grep "import" {} \; - Pythonファイル内の"import"を検索find . -name "*.log" -mtime -7 -exec grep "ERROR" {} \; - 過去7日以内に変更されたログファイル内の"ERROR"を検索find . -type f -not -path "*/\.*" -exec grep -l "TODO" {} \; - 隠しファイルを除く全ファイル内の"TODO"を含むファイル名を表示find . -name "*.conf" -exec grep -l "DEBUG" {} \; | xargs cp -t /backup/debug-configs/ - DEBUGを含む設定ファイルをバックアップディレクトリにコピーfind . -name "*.java" -exec grep -l "Deprecated" {} \; | xargs sed -i 's/Deprecated/DEPRECATED/g' - 非推奨マークのあるJavaファイルを一括編集find . -type f -size +1M -exec grep -l "ERROR" {} \; | xargs ls -lh - エラーを含む大きなファイルの詳細情報を表示find . -name "*.log" -exec grep -q "FATAL" {} \; -print - "FATAL"を含むログファイルのパスのみを表示find . -name "*.sh" -type f -exec grep -l "#!/bin/bash" {} \; | xargs chmod +x - bashスクリプトに実行権限を付与