fd はファイルシステム内の項目を探すためのプログラムで、従来の find コマンドよりシンプルで高速、かつユーザーフレンドリーな代替です
find のすべての機能を備えているわけではありませんが、一般的なユースケースに対して妥当なデフォルト値を提供します
- Windows、macOS、Linux
- 直感的な構文:
fd PATTERN 形式で簡単に使用可能(find -iname '*PATTERN*' より手軽)
- 正規表現および glob パターンをサポート
- 並列ディレクトリ探索により高速なパフォーマンスを提供
- ファイル種別ごとの色分け表示(
ls に類似)
- 並列コマンド実行をサポート
- スマートな大文字・小文字の区別: デフォルトでは大文字・小文字を無視し、大文字が含まれる場合は区別
- 隠しファイルとディレクトリをデフォルトで無視
.gitignore パターンをデフォルトで尊重
- コマンド名が
find より 50% 短い
使い方
- 現在のディレクトリでパターンを含む項目を検索
fd netfl
- 正規表現を使った検索が可能
fd '^x.*rc$'
- 特定のディレクトリで検索
fd passwd /etc
- 現在のディレクトリ以下のすべてのファイルを再帰的に一覧表示
fd
- 特定のファイル形式を検索可能(
-e オプションを使用) fd -e md
- 正確なファイル名を検索可能(
-g オプションを使用) fd -g libc.so /usr
- 隠しファイルおよび無視されたファイルを含めて検索(
-H, -I オプションを使用) fd -H pre-commit fd -I num_cpu
- ファイル名ではなく完全なパス全体で検索(
-p オプションを使用) fd -p '.*/lesson-\d+/[a-z]+.(jpg|png)'
- 検索された各結果に対してコマンドを実行(
-x) fd -e zip -x unzip
- すべての検索結果を 1 つのコマンドに渡す(
-X) fd -g 'test_*.py' -X vim
- プレースホルダー構文
- {}: 検索結果の完全なパス
- {.}: ファイル拡張子を除いたパス
- {/}: ファイル名
- {//}: 親ディレクトリ
- {/.}: ファイル名から拡張子を除いたもの
- 特定のディレクトリまたはファイルを除外可能(
-E オプションを使用) fd -H -E .git
.fdignore ファイルを作成してグローバルな除外パターンを設定可能
- 検索されたファイルを削除可能(
-X rm) fd -H '^\.DS_Store$' -tf -X rm
主なコマンドオプション
- -H: 隠しファイルおよびディレクトリを含めて検索
- -I:
.gitignore および .fdignore を無視
- -p: 完全なパスで検索
- -e: 特定の拡張子を検索
- -x: 検索結果に対してコマンドを実行
- -X: すべての検索結果を 1 つのコマンドに渡す
- -E: 特定のファイルまたはディレクトリを除外
パフォーマンス比較(ベンチマーク)
- 750,000 個のディレクトリと 400 万個のファイルでの検索テスト結果
- find の性能: 約 19.9 秒
- fd の性能: 約 854.8ms
- find より 23 倍高速
他のプログラムとの統合
- fd の検索結果を fzf で表示可能
export FZF_DEFAULT_COMMAND='fd --type file'
- fd の出力結果を rofi でメニュー表示
fd --type f -e pdf . $HOME | rofi -dmenu
- 出力結果をツリー構造で表示
fd | tree --fromfile
- 検索結果を xargs で利用可能
fd -0 -e rs | xargs -0 wc -l
2件のコメント
neovim plugin の中に
fdを使うものがあって、インストールしてから今まで使っていますね(笑)。Hacker Newsのコメント
--typeフラグがあるが、意味が異なる--extensionフラグがあるが、rg にはないfind . | grep what_i_am_looking_forを使っている