[中文] [한국어]
fd
、ファイルシステムにエントリを見つけるプログラムです。 find
は、シンプルで速く、ユーザーフレンドリーな代替品です。 find
のすべての強力な機能をサポートすることを目的としていませんが、ほとんどのユースケースで賢明な(意見のある)デフォルトを提供します。
インストール•使用方法•トラブルシューティング
find -iname '*PATTERN*'
の代わりにfd PATTERN
。ls
と同じ)を強調します。.gitignore
のパターンを無視します。find
も50%短く*。 まず、利用可能なすべてのコマンドラインオプションの概要を取得するために、簡潔なヘルプメッセージの場合はfd -h
を実行するか、より詳細なバージョンの場合はfd --help
使用できます。
FDは、ファイルシステムにエントリを見つけるように設計されています。実行できる最も基本的な検索は、単一の引数でFDを実行することです:検索パターン。たとえば、あなたの古いスクリプトを見つけたいと仮定します(名前にはnetflix
が含まれています):
> fd netfl
Software/python/imdb-ratings/netflix-details.py
このような単一の引数だけで呼び出された場合、 FDはパターンnetfl
含むエントリを再帰的に現在のディレクトリを検索します。
検索パターンは正規表現として扱われます。ここでは、 x
から始まり、 rc
で終わるエントリを検索します。
> cd /etc
> fd ' ^x.*rc$ '
X11/xinit/xinitrc
X11/xinit/xserverrc
fd
で使用される正規表現構文はここに記載されています。
特定のディレクトリを検索したい場合は、 FDへの2番目の引数として指定できます。
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
FDは引数なしで呼び出すことができます。これは、現在のディレクトリls -R
のすべてのエントリの概要を概説するのに非常に便利です。
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
この機能を使用して特定のディレクトリ内のすべてのファイルをリストする場合は、次のようなキャッチオールパターンを使用する必要があります.
または^
:
> fd . fd/tests/
testenv
testenv/mod.rs
tests.rs
多くの場合、特定のタイプのすべてのファイルに興味があります。これは、 -e
(または--extension
)オプションで実行できます。ここでは、FDリポジトリ内のすべてのマークダウンファイルを検索します。
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
-e
オプションは、検索パターンと組み合わせて使用できます。
> fd -e rs mod
src/fshelper/mod.rs
src/lscolors/mod.rs
tests/testenv/mod.rs
提供された検索パターンの正確なファイルを見つけるには、 -g
(or --glob
)オプションを使用します。
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
デフォルトでは、 FDは非表示のディレクトリを検索せず、検索結果に非表示ファイルが表示されません。この動作を無効にするには、 -H
(または--hidden
)オプションを使用できます。
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
GITリポジトリのディレクトリで動作する場合(またはGITリポジトリを含む)、 FDは.gitignore
パターンの1つに一致するフォルダーを検索しません(およびファイルを表示しません)。この動作を無効にするには、 -I
(または--no-ignore
)オプションを使用できます。
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
すべてのファイルとディレクトリを実際に検索するには、非表示を組み合わせて機能を無視してすべて( -HI
)を表示するか、 -u
/ --unrestricted
使用します。
デフォルトでは、 FDは各ファイルのファイル名のみに一致します。ただし、 --full-path
または-p
オプションを使用すると、フルパスと一致させることができます。
> fd -p -g ' **/.git/config '
> fd -p ' .*/lesson-d+/[a-z]+.(jpg|png) '
検索結果を表示するだけでなく、それらと一緒に何かをしたいと思うことがよくあります。 fd
検索結果ごとに外部コマンドを実行する2つの方法を提供します。
-x
/ --exec
オプションは、検索結果のそれぞれに対して外部コマンドを実行します(並行して)。-X
/ --exec-batch
オプションは、すべての検索結果を引数として1回起動します。 すべてのzipアーカイブを再帰的に見つけて、それらを解き放ちます。
fd -e zip -x unzip
そのようなファイルが2つある場合、 file1.zip
とbackup/file2.zip
ある場合、これはunzip file1.zip
とunzip backup/file2.zip
を実行します。 2つのunzip
プロセスは並行して実行されます(ファイルが十分に速く見つかった場合)。
すべての*.h
と*.cpp
ファイルを見つけて、それらをclang-format -i
:
fd -e h -e cpp -x clang-format -i
clang-format
の-i
オプションを別の引数としてどのように渡すことができるかに注意してください。これが、 -x
オプションを最後に配置する理由です。
すべてのtest_*.py
ファイルを見つけて、お気に入りのエディターで開きます。
fd -g ' test_*.py ' -X vim
ここでは、Capital -X
使用して単一のvim
インスタンスを開くことに注意してください。そのようなファイルが2つある場合、 test_basic.py
とlib/test_advanced.py
、これはvim test_basic.py lib/test_advanced.py
を実行します。
ファイル許可、所有者、ファイルサイズなどなどの詳細を確認するには、結果ごとにls
実行してfd
に表示するように指示できます。
fd … -X ls -lhd --color=always
このパターンは非常に便利であるため、 fd
ショートカットを提供します。 -l
/ --list-details
オプションを使用して、この方法でls
を実行できます: fd … -l
。
-X
オプションは、すべてのC ++ソースファイルなど、特定のクラスのファイル内で検索するために、 fd
とRIPGrep( rg
)を組み合わせる場合にも役立ちます。
fd -e cpp -e cxx -e h -e hpp -X rg ' std::cout '
すべての*.jpg
ファイルを*.png
ファイルに変換します。
fd -e jpg -x convert {} {.}.png
ここで、 {}
検索結果のプレースホルダーです。 {.}
、ファイル拡張子なしで同じです。プレースホルダーの構文の詳細については、以下を参照してください。
-x
使用してパラレルスレッドから実行されるコマンドの端子出力は、インターレースまたは文字化けされることはないため、 fd -x
使用して、多くのファイル上のタスクの実行と共同的に並行して並列化できます。この例は、ディレクトリ内の個々のファイルのチェックサムを計算することです。
fd -tf -x md5sum > file_checksums.txt
-x
および-X
オプションは、単一の文字列の代わりに一連の引数としてコマンドテンプレートを使用します。コマンドテンプレートの後にfd
に追加オプションを追加する場合は、 ;
。
コマンドを生成するための構文は、GNUの並列の構文と似ています。
{}
:検索結果のパスに置き換えるプレースホルダートークン( documents/images/party.jpg
)。{.}
: {}
のように、しかしファイル拡張子( documents/images/party
)がありません。{/}
:検索結果のベースネーム( party.jpg
)に置き換えるプレースホルダー。{//}
:発見されたパスの親( documents/images
)。{/.}
:拡張機能が削除されたベースネーム( party
)。プレースホルダーを含めない場合、 FDは最後に{}
自動的に追加します。
-x
/ --exec
の場合、 -j
/ --threads
オプションを使用して並列ジョブの数を制御できます。シリアル実行には--threads=1
を使用します。
特定のサブディレクトリからの検索結果を無視したい場合があります。たとえば、すべての非表示ファイルとディレクトリ( -H
)を検索することをお勧めしますが、 .git
ディレクトリからすべての一致を除外します。これには-E
(または--exclude
)オプションを使用できます。それは議論として任意のグローブパターンを取ります:
> fd -H -E .git …
これを使用して、マウントされたディレクトリをスキップすることもできます。
> fd -E /mnt/external-drive …
..または特定のファイルタイプをスキップするには:
> fd -E ' *.bak ' …
これらの永続的な除外パターンを作成するには、 .fdignore
ファイルを作成できます。それらは.gitignore
ファイルのように機能しますが、 fd
に固有です。例えば:
> cat ~ /.fdignore
/mnt/external-drive
* .bak
注記
fd
、 rg
やag
などの他のプログラムで使用される.ignore
ファイルもサポートしています。
fd
これらのパターンをグローバルに無視したい場合は、 fd
のGlobal Ignoreファイルに配置できます。これは通常~/.config/fd/ignore
、Windowsには%APPDATA%fdignore
。
.git fd/ignore
--hidden
に.git/
含めることをお勧めします。これにより、 .git
ディレクトリが使用されます。
fd
使用して、検索パターンと一致するすべてのファイルとディレクトリを削除できます。ファイルのみを削除する場合は、 --exec-batch
/ -X
オプションを使用してrm
を呼び出すことができます。たとえば、すべての.DS_Store
ファイルを再帰的に削除するには、実行します。
> fd -H ' ^.DS_Store$ ' -tf -X rm
確信が持てない場合は、最初に-X rm
なしでfd
に電話してください。または、 rm
Sの「インタラクティブ」オプションを使用します。
> fd -H ' ^.DS_Store$ ' -tf -X rm -i
特定のクラスのディレクトリを削除したい場合は、同じテクニックを使用できます。 rm
S --recursive
/ -r
フラグを使用してディレクトリを削除する必要があります。
注記
fd … -X rm -r
レース条件を引き起こす可能性があります。 …/foo/bar/foo/…
のようなパスがある場合、そしてfoo
という名前のすべてのディレクトリを削除したい場合は、最終的には状況で終わる可能性があります。最初に外側のfoo
ディレクトリが削除され、(無害) 「foo/bar/foo ':そのようなファイルまたはディレクトリ「 rm
コールのエラーはありません。
これはfd -h
の出力です。コマンドラインオプションの完全なセットを表示するには、 fd --help
を使用して、より詳細なヘルプテキストも含まれています。
Usage: fd [OPTIONS] [pattern] [path]...
Arguments:
[pattern] the search pattern (a regular expression, unless '--glob' is used; optional)
[path]... the root directories for the filesystem search (optional)
Options:
-H, --hidden Search hidden files and directories
-I, --no-ignore Do not respect .(git|fd)ignore files
-s, --case-sensitive Case-sensitive search (default: smart case)
-i, --ignore-case Case-insensitive search (default: smart case)
-g, --glob Glob-based search (default: regular expression)
-a, --absolute-path Show absolute instead of relative paths
-l, --list-details Use a long listing format with file metadata
-L, --follow Follow symbolic links
-p, --full-path Search full abs. path (default: filename only)
-d, --max-depth <depth> Set maximum search depth (default: none)
-E, --exclude <pattern> Exclude entries that match the given glob pattern
-t, --type <filetype> Filter by type: file (f), directory (d/dir), symlink (l),
executable (x), empty (e), socket (s), pipe (p), char-device
(c), block-device (b)
-e, --extension <ext> Filter by file extension
-S, --size <size> Limit results based on the size of files
--changed-within <date|dur> Filter by file modification time (newer than)
--changed-before <date|dur> Filter by file modification time (older than)
-o, --owner <user:group> Filter by owning user and/or group
--format <fmt> Print results according to template
-x, --exec <cmd>... Execute a command for each search result
-X, --exec-batch <cmd>... Execute a command with all search results at once
-c, --color <when> When to use colors [default: auto] [possible values: auto,
always, never]
--hyperlink[=<when>] Add hyperlinks to output paths [default: never] [possible
values: auto, always, never]
-h, --help Print help (see more with '--help')
-V, --version Print version
[0-9].jpg
で終わるファイルをホームフォルダを検索しましょう。 〜750.000のサブディレクトリと約400万のファイルが含まれています。平均化と統計分析のために、私はHyperfineを使用しています。次のベンチマークは、「温かい」/事前に充填されたディスクキャッシュで実行されます(「コールド」ディスクキャッシュの結果は同じトレンドを示しています)。
find
ことから始めましょう:
Benchmark 1: find ~ -iregex '.*[0-9].jpg$'
Time (mean ± σ): 19.922 s ± 0.109 s
Range (min … max): 19.765 s … 20.065 s
定期的な発現検索を実行する必要がない場合、 find
はるかに高速です。
Benchmark 2: find ~ -iname '*[0-9].jpg'
Time (mean ± σ): 11.226 s ± 0.104 s
Range (min … max): 11.119 s … 11.466 s
それでは、 fd
についても同じことを試してみましょう。 fd
デフォルトで正規表現検索を実行することに注意してください。公正な比較のために、オプション-u
/ --unrestricted
オプションがここで必要です。それ以外の場合、 fd
非表示のフォルダーを通過してパスを無視する必要がありません(以下を参照):
Benchmark 3: fd -u '[0-9].jpg$' ~
Time (mean ± σ): 854.8 ms ± 10.0 ms
Range (min … max): 839.2 ms … 868.9 ms
この特定の例では、 fd
find -iregex
の約23倍高速で、 find -iname
よりも約13倍高速です。ちなみに、両方のツールがまったく同じ546ファイルを見つけましたか?
注:これは、 1つの特定のマシン上の特定のベンチマークです。さまざまなテストを実行しましたが(一貫した結果が見つかりました)、物事はあなたにとって異なるかもしれません!私たちは誰もが自分で試してみることをお勧めします。必要なすべてのスクリプトについては、このリポジトリを参照してください。
FDの速度に関しては、多くのクレジットがregex
にかかっており、Ripgrepでも使用されている木枠ignore
(チェックしてください!)。
fd
私のファイルを見つけません! fd
デフォルトで非表示のディレクトリとファイルを無視することを忘れないでください。また、 .gitignore
ファイルからのパターンも無視します。すべての可能なファイルを絶対に見つけたい場合は、常にオプションを使用してください-u
/ --unrestricted
オプション(または-HI
非表示および無視されたファイルを有効にします):
> fd -u …
fd
ls
と同じように、さらにファイルを色付けできます。これが機能するためには、環境変数LS_COLORS
設定する必要があります。通常、この変数の値は、さまざまなファイル形式の色を定義するための便利な構成形式を提供するdircolors
コマンドによって設定されます。ほとんどの分布では、 LS_COLORS
すでに設定する必要があります。 Windowsにいる場合、または代替、より完全な(またはよりカラフルな)バリアントを探している場合は、こちら、こちら、またはこちらをご覧ください。
fd
また、 NO_COLOR
環境変数を称えます。
fd
私の正規逆パターンを正しく解釈していないようです多くの特別な正規表現( []
、 ^
、 $
、..など)もあなたのシェルの特殊文字です。疑わしい場合は、常に正規表現パターンの周りに単一の引用を置くようにしてください。
> fd ' ^[A-Z][0-9]+$ '
パターンがダッシュで始まる場合は、追加する--
があります。コマンドラインオプションの終了を知らせます。それ以外の場合、パターンはコマンドラインオプションとして解釈されます。または、単一のハイフン文字を持つキャラクタークラスを使用します。
> fd -- ' -pattern '
> fd ' [-]pattern '
alias
ESまたはシェル関数の「コマンドが見つかりません」シェルalias
ESおよびシェル関数は、 fd -x
またはfd -X
を介したコマンド実行には使用できません。 zsh
では、 alias -g myalias="…"
。 bash
では、 export -f my_function
使用して、子プロセスを利用できるようにすることができます。まだfd -x bash -c 'my_function "$1"' bash
呼び出す必要があります。他のユースケースまたはシェルには、(一時的な)シェルスクリプトを使用します。
fzf
でFDを使用しますFDを使用して、コマンドラインファジーファインダーFZFの入力を生成できます。
export FZF_DEFAULT_COMMAND= ' fd --type file '
export FZF_CTRL_T_COMMAND= " $FZF_DEFAULT_COMMAND "
次に、端末にvim <Ctrl-T>
と入力してFZFを開き、FD応答を検索できます。
または、シンボリックリンクに従い、非表示ファイルを含めることをお勧めします(ただし、 .git
フォルダーを除外):
export FZF_DEFAULT_COMMAND= ' fd --type file --follow --hidden --exclude .git '
FZF内のFDの色の出力を設定して使用することもできます。
export FZF_DEFAULT_COMMAND= " fd --type file --color=always "
export FZF_DEFAULT_OPTS= " --ansi "
詳細については、FZF READMEのヒントセクションを参照してください。
rofi
でFDを使用しますRofiは、 Stdinから読み取ることでメニューを作成できるグラフィカルな起動メニューアプリケーションです。 rofi
s -dmenu
モードへのパイピングfd
出力は、ファジー検索可能なファイルとディレクトリのリストを作成します。
$HOME
ディレクトリの下にPDFファイルのケースに依存しない検索可能なマルチセレクトリストを作成し、構成されたPDFビューアーで選択を開きます。すべてのファイルタイプをリストするには、 -e pdf
引数をドロップします。
fd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}
Rofiによって提示されるリストを変更するには、 fd
コマンドに引数を追加します。 Rofiの検索動作を変更するには、 rofi
コマンドに引数を追加します。
emacs
でFDを使用しますEMACSパッケージFind-File-in-Projectは、 FDを使用してファイルを検索できます。
find-file-in-project
をインストールした後、 ~/.emacs
または~/.emacs.d/init.el
ファイルに行(setq ffip-use-rust-fd t)
を追加します。
EMACSでは、 Mx find-file-in-project-by-selected
を実行して、一致するファイルを見つけます。または、 Mx find-file-in-project
を実行して、プロジェクト内の利用可能なすべてのファイルをリストします。
fd
の出力をファイルツリーとしてフォーマットするには、 --fromfile
:でtree
コマンドを使用できます。
❯ fd | tree --fromfile
これは、 tree
デフォルトでファイルを無視しないため、 fd
印刷するものを制御するための豊富なオプションをサポートしていないため、それ自体でtree
実行するよりも便利です。
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
Bashなどで同様に、単にエイリアスを作成できます。
❯ alias as-tree= ' tree --fromfile '
xargs
またはparallel
でFDを使用しますfd
は、 -x
/ --exec
および-X
/ --exec-batch
オプションを使用して、コマンド実行用のビルトイン機能があることに注意してください。必要に応じて、 xargs
と組み合わせて使用できます。
> fd -0 -e rs | xargs -0 wc -l
ここでは、 -0
オプションはFDに、 (newlinesの代わりに)null文字で検索結果を分離するように指示します。同様に、 xargs
の-0
オプションは、この方法で入力を読み取るように指示します。
...およびその他のDebianベースのLinux分布。
Ubuntu 19.04(disco dingo)以下を実行する場合は、正式に維持されているパッケージをインストールできます。
apt install fd-find
バイナリ名fd
がすでに別のパッケージで使用されているため、バイナリはfdfind
と呼ばれていることに注意してください。インストール後、このドキュメントと同じ方法でfd
使用するために、command ln -s $(which fdfind) ~/.local/bin/fd
実行することにより、 fd
へのリンクを追加することをお勧めします。 $HOME/.local/bin
が$PATH
にあることを確認してください。
ubuntuの古いバージョンを使用する場合は、リリースページから最新の.deb
パッケージをダウンロードして、以下をインストールできます。
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
このプロジェクトのリリースページの.debパッケージは、実行可能fd
にまだ名前が付いていることに注意してください。
Debian BusterまたはNewerを実行すると、正式に維持されているDebianパッケージをインストールできます。
apt-get install fd-find
バイナリ名fd
がすでに別のパッケージで使用されているため、バイナリはfdfind
と呼ばれていることに注意してください。インストール後、このドキュメントと同じ方法でfd
使用するために、command ln -s $(which fdfind) ~/.local/bin/fd
実行することにより、 fd
へのリンクを追加することをお勧めします。 $HOME/.local/bin
が$PATH
にあることを確認してください。
このプロジェクトのリリースページの.debパッケージは、実行可能fd
にまだ名前が付いていることに注意してください。
Fedora 28から始めて、公式パッケージソースからfd
をインストールできます。
dnf install fd-find
適切なリポジトリを有効にしている場合、公式ソースからFDパッケージをインストールできます。
apk add fd
公式レポスからFDパッケージをインストールできます。
pacman -S fd
AURからFDをインストールすることもできます。
公式リポジトリのFD Ebuildを使用できます。
emerge -av fd
公式リポジトリからFDパッケージをインストールできます。
zypper in fd
xbps-install経由でfd
インストールできます。
xbps-install -S fd
公式リポジトリからFDパッケージをインストールできます。
apt-get install fd
公式リポジトリからFDパッケージをインストールできます。
eopkg install fd
Fedora Coprからfd
パッケージをインストールできます。
dnf copr enable tkbcopr/fd
dnf install fd
jemallocの代わりに遅いmallocを使用する別のバージョンも、epel8/9リポジトリからパッケージfd-find
として利用できます。
homebrewでfd
をインストールできます。
brew install fd
…またはMacPortsと:
port install fd
リリースページから事前に構築されたバイナリをダウンロードできます。
または、Scoop経由でfd
をインストールできます。
scoop install fd
またはチョコレートを介して:
choco install fd
またはWinget経由:
winget install sharkdp.fd
公式リポジトリからFDパッケージをインストールできます。
guix install fd
NIXパッケージマネージャーを使用してfd
をインストールできます。
nix-env -i fd
Floxを使用してfd
Flox環境にインストールできます。
flox install fd
公式リポジトリからFD-Findパッケージをインストールできます。
pkg install fd-find
LinuxとMacOSでは、FD-Findパッケージをインストールできます。
npm install -g fd-find
Rustのパッケージマネージャーカーゴを使用すると、 FDを介してインストールできます。
cargo install fd-find
Rustバージョン1.77.2以降が必要であることに注意してください。
ビルドにもmake
必要です。
リリースページには、Linux、MacOS、およびWindows用のプリコンパイルされたバイナリが含まれています。静的にリンクされたバイナリも利用できます。ファイル名にmusl
を備えたアーカイブを探します。
git clone https://github.com/sharkdp/fd
# Build
cd fd
cargo build
# Run unit tests and integration tests
cargo test
# Install
cargo install --path .
fd
、MITライセンスとApacheライセンス2.0の両方の条件の下で配布されます。
ライセンスの詳細については、ライセンスAPACHEおよびライセンスマイットファイルを参照してください。