ファイルを検索したい(fd)

$ fd 検索条件 検索パス

findの代替コマンドです。 .gitignoreに書かれているファイルは無視してくれます。 findと引数の位置が入れ替わっているのはちょっと罠です。

検索パターンはデフォルトで正規表現として扱われます。 globパターンを使いたい場合は--globオプションを付けます。

インストール

$ brew install fd
$ fd --version
fd 10.4.2

拡張子で探したい(-e / --extension)

// HTMLファイルを探したい
$ fd --extension html 検索パス
$ fd -e html 検索パス

// ZIPファイルを探したい
$ fd --extension zip 検索パス
$ fd -e zip 検索パス

--extensionオプションを使ってファイルの拡張子を指定して検索できます。 find -name "*.html"とは異なり、.や*を付けずに拡張子名だけを指定します。

ファイルの種類で探したい(-t / --type)

// ファイルを探したい; find 検索パス -type f
$ fd --type file 検索パス
$ fd -t f 検索パス

// ディレクトリを探したい; find 検索パス -type d
$ fd --type directory 検索パス
$ fd -t d 検索パス

// シンボリックリンクを探したい; find 検索パス -type l
$ fd --type symlink 検索パス
$ fd -t l 検索パス

// 空のディレクトリを探したい; find 検索パス -type d -empty
$ fd --type directory --type empty 検索パス
$ fd -t d -t empty 検索パス

// 実行可能なファイルを探したい
$ fd --type executable 検索パス
$ fd -t x 検索パス

--typeオプションを使ってファイルの種類で検索できます。 --typeオプションは重ねがけできるので--type directory --type emptyで空のディレクトリを検索できます。 --type executableで実行可能なファイルを検索できます。

タイムスタンプで探したい(--changed-within / --changed-before)

// 7日以内に変更されたファイルを探したい
$ fd --changed-within 7d 検索パス

// 28日以上前から変更されていないファイルを探したい
$ fd --changed-before 28d 検索パス

--changed-within・--changed-beforeオプションで、 ファイルの最終更新日時(findの-mtime相当)を基準に検索できます。 findのように作成日・最終アクセス日を個別に指定するオプションはありません。

サイズで探したい(-S / --size)

// 100kB以上のファイルを探したい
$ fd --size +100k 検索パス
$ fd -S +100k 検索パス

// 10MB以上のファイルを探したい
$ fd --size +10M 検索パス
$ fd -S +10M 検索パス

// 10MB - 50MBのファイルを探したい
$ fd --size +10M --size -50M 検索パス
$ fd -S +10M -S -50M 検索パス

--sizeオプションでファイルサイズを基準に検索できます。

深さを指定したい(-d / --max-depth)

// 2階層目まで探したい
$ fd --max-depth 2 検索パターン 検索パス
$ fd -d 2 検索パターン 検索パス

// 4階層目まで探したい
$ fd --max-depth 4 検索パターン 検索パス
$ fd -d 4 検索パターン 検索パス

--max-depthオプションで検索する階層の深さを指定できます。

正規表現で探したい(デフォルト)

$ fd 正規表現 検索パス

fdは検索パターンをデフォルトで正規表現として扱います。 find -regexのように専用オプションは不要です。 globパターンを使いたい場合は--globオプションを付けます。

検索結果の出力形式を変えたい(--exec-batch ls -l)

// 検索結果を ls -l 形式で書きだす
$ fd 検索パターン 検索パス --exec-batch ls -l
$ fd 検索パターン 検索パス -X ls -l

find -lsに相当する専用オプションはありませんが、 -X/--exec-batchオプションでls -lを呼び出すことで同じ結果が得られます。

空のディレクトリを削除したい

$ fd --type directory --type empty 検索パス --exec-batch rmdir
$ fd -t d -t empty 検索パス -X rmdir

--type directory --type emptyで空のディレクトリを検索し、 -X/--exec-batchオプションでrmdirを呼び出すと一括削除できます。

パイプ処理したい(-x / -X)

$ fd 検索条件 検索パス --exec コマンド
$ fd 検索条件 検索パス -x コマンド

$ fd 検索条件 検索パス --exec-batch コマンド
$ fd 検索条件 検索パス -X コマンド

fdにはxargs相当の機能が組み込まれています。 -x/--execは検索結果1件ごとにコマンドを実行し、 -X/--exec-batchは検索結果をまとめて1回のコマンドに渡します。