fd - `find` のシンプルで高速、かつユーザーフレンドリーな代替
(github.com/sharkdp)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-commitfd -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を使っている