ファイル、ディレクトリ、テキスト内容などを検索するコマンドです。
指定した条件に一致するファイルやディレクトリを検索します。
構文/オプション | 説明 |
---|---|
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スクリプトに実行権限を付与