fd について
シェルでのファイル検索に `fd` を使う方法を示し、オプション、既定の動作、制約を説明するスキルです。スクリプトやプロジェクト文書を扱う開発者向けで、必要に応じて `find` に切り替える方法も扱います。
主な機能
- 01名前、拡張子、パスで検索
- 02隠し項目や除外項目の絞り込み
- 03深さの制限とパスの除外
- 04検索結果に対するコマンド実行
- 05`find` へのフォールバック指針
活用シーン
- 01リポジトリ内のファイル検索
- 02スクリプト内の `find` コマンド置換
- 03除外対象や隠しパスの検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ petr-korobeinikov/ skills --skill fdインストール後、Claude Code で/fdを入力して読み込まれたか確認します。
詳細
fd
ファイルシステムの検索には、find より fd を優先してください。
fd は大きなディレクトリツリーでの処理が速く、
より適切なデフォルト設定
(.gitignore を尊重し、大文字・小文字を自動判定し、デフォルトで正規表現を使用)を備え、
CLI もより使いやすくなっています。
公式ドキュメント:
https://github.com/sharkdp/fd
(README と fd --help)。
重要な形式を使う場合は、マニュアルで確認してから使用してください。
理由
- ディレクトリを並列で走査します —
大規模なリポジトリでは、
findより明らかに高速です。 - すぐに使える適切なデフォルト設定:
隠し項目はスキップされ、
Git リポジトリ内では
.gitignore/.ignore/.fdignoreが尊重され、 大文字・小文字を自動判定し (パターンに大文字が含まれない限り、大文字・小文字を区別しません)、 パターンにはデフォルトで正規表現を使用します。 - デフォルトでは、パターンはフルパスではなくファイル名に照合されます —
fd fooは、ワイルドカードや引用符を使わずにfind . -iname '*foo*'と同じ動作をします。 - 並列実行の
-x、 NUL 区切りの出力(-0)、-print/-pruneのような複雑な指定をせずに組み合わせられる、一貫したオプションセットを備えています。
ルール
fd PATTERN [PATH]
最初の位置引数はパターン、
2 番目は検索ルートです
(デフォルトは現在のディレクトリです)。
スラッシュを含むパス形式の最初の引数は、パスではありません —
fd . PATH または fd --full-path PATTERN を使用してください。
直接置き換える場合
| 使わないでください | 代わりに使ってください |
|---|---|
find . -name 'foo*' | fd '^foo' |
find . -iname '*.md' | fd -e md |
find . -type f -name foo | fd -t f foo |
find . -type d -name node_modules | fd -t d node_modules |
find . -type l | fd -t l |
find . -name '*.txt' -delete | fd -e txt -X rm |
find . -name '*.txt' -exec rm {} \; | fd -e txt -x rm |
find . -name node_modules -prune | fd -E node_modules |
find . -size +100M | fd -S +100mi |
find . -mtime -7 | fd --changed-within 7d |
find . -mtime +7 | fd --changed-before 7d |
find . -name '*.go' -print0 | xargs -0 wc -l | fd -e go -0 | xargs -0 wc -l |
find /etc -name passwd | fd passwd /etc |
find / -name foo | fd -u foo / |
find -size と完全に同じ条件で検索するには、
2 進接頭辞
(ki、mi、gi)を使用してください —
-S +100m は 100 * 10^6 バイト、
-S +100mi は 100 * 2^20 バイトを意味します。
隠し項目と .gitignore で無視されるディレクトリも対象にして find / で検索する場合は、
-u(--no-ignore --hidden のエイリアス)を追加してください。
イディオム
拡張子で照合します(1 つまたは複数):
fd -e md
fd -e h -e cpp
シェル形式のパターンにはグロブモードを使用します
(-g を指定すると、** と * が一般的な意味で使われます):
fd -g '**/*.test.ts'
fd -g 'libc.so' /usr
ファイル名だけでなく、 フルパス全体を照合します:
fd --full-path 'src/.*\.proto$'
隠し項目
(.git、.vscode など)を含めつつ、
.gitignore のルールは維持します:
fd -H pre-commit
隠し項目は隠したまま、.gitignore のルールを無視します:
fd -I node_modules
隠し項目と無視対象の両方を含めて、すべてを検索します:
fd -u PATTERN
パスを除外します (グロブ構文を使用し、すべての無視ルールに優先し、繰り返し指定できます):
fd -E .git -E '*.bak' PATTERN
深さを制限します:
fd -d 2 -t d
必須のパターンを複数組み合わせます (すべてファイル名に一致する必要があります。デフォルトでは正規表現を使用します):
fd 'foo' --and 'bar' --and 'baz'
結果ごとにコマンドを実行します
(並列実行、{} による置換、\; の終了記号は不要です):
fd -e jpg -x convert {} {.}.png
すべての結果を引数として一度に実行します
(wc、clang-format、rg などの一括処理ツール向け):
fd -e rs -X wc -l
NUL 区切りで他のツールに渡します:
fd -e go -0 | xargs -0 wc -l
注意点
- 最初の位置引数はパスではなくパターンです。
fd /etc/passwdは/etc/passwdを/を含む正規表現として解釈し、fd . /etc/passwdを使うか--full-pathを指定するよう提案してエラーになります。 - デフォルトの検索では、隠しファイルと
.gitignoreの対象エントリは除外されます。node_modulesや.git内を検索する場合は、-H -I(または-u)を追加してください。 追加しないと、誤った理由で結果リストが空になります。 --execはデフォルトで並列実行します。 出力順は不定です。 順次実行が必要な場合は、-j 1(または--threads 1)を指定してください。- パターンはデフォルトで正規表現です。
.単体は任意の文字に一致します。 リテラルの.fooに一致させるには、'\.foo$'のようにアンカーを付けるか、-F/--fixed-stringsを指定してください。 - サイズの接尾辞はデフォルトで10進SI単位です。
-S +100mは100 MB(mは10^6バイト)です。find -sizeの動作と厳密に一致させる場合は、 2進単位のmi/ki/giを使用してください。
find へのフォールバック
fd を常に利用できるとは限りません。
最小構成のCIイメージ、
制限の厳しいサーバー、
追加パッケージを含まないコンテナのベースイメージなどが該当します。
command -v で確認し、find にフォールバックしてください。
if command -v fd >/dev/null; then
fd -e log -t f -X rm
else
find . -type f -name '*.log' -exec rm {} +
fi
管理されたローカル環境で一度だけ実行するスニペットには、
fd をそのまま使用してください。
対象ホストに fd がないとわかっている場合に限り、
無条件で find に切り替えてください
(例:イメージに fd が含まれていない最小構成のAlpineコンテナ)。
このスキルを満たすためだけに、
fd を自動でインストールしないでください。
fd がない場合は、フォールバックするのが適切な対応です。
fd のインストール
- macOS:
brew install fd - Debian/Ubuntu:
apt install fd-find— 名前の競合を避けるため、 バイナリ名はfdfindです (標準的な回避策はalias fd=fdfindです)。 - Fedora:
dnf install fd-find - Arch:
pacman -S fd - Alpine:
apk add fd - 事前ビルド済みバイナリおよびその他のプラットフォーム: https://github.com/sharkdp/fd/releases
miseでホストのツールを管理している場合、
レジストリの短縮名 fd は aqua:sharkdp/fd に解決されます。
mise use -g fd@<version> でインストールしてください
(プロジェクトの mise スキルに従ってバージョンを固定してください)。
ubi: バックエンドは使用しないでください。
mise スキルで無効化されています。
適用範囲
シェルスニペットでファイルシステムを検索するすべての箇所に適用されます。
Bashツールの呼び出し。SKILL.md/README.md/ドキュメント内のスニペット。scripts/配下のスクリプト。- Makefileのレシピ。
- CI設定。
- インストール手順。
ファイルの編集時に find の呼び出しを見つけた場合は、
同じ編集の一環として、同等の fd 形式に置き換えてください
(スニペットを fd がない可能性のあるホストで実行する必要がある場合は、
find へのフォールバックも追加してください)。