[中文] [한국어]
fd
est un programme pour trouver des entrées dans votre système de fichiers. Il s'agit d'une alternative simple, rapide et conviviale à find
. Bien qu'il ne vise pas à soutenir toutes les fonctionnalités puissantes de find
, il fournit des défaillances sensibles (d'opinion) pour la majorité des cas d'utilisation.
Installation • Comment utiliser • Dépannage
fd PATTERN
au lieu de find -iname '*PATTERN*'
.ls
)..gitignore
, par défaut.find
:-). Tout d'abord, pour obtenir un aperçu de toutes les options de ligne de commande disponibles, vous pouvez soit exécuter fd -h
pour un message d'aide concis ou fd --help
pour une version plus détaillée.
FD est conçu pour trouver des entrées dans votre système de fichiers. La recherche la plus élémentaire que vous pouvez effectuer consiste à exécuter FD avec un seul argument: le modèle de recherche. Par exemple, supposons que vous souhaitez trouver un ancien script de vôtre (le nom inclus netflix
):
> fd netfl
Software/python/imdb-ratings/netflix-details.py
S'il est appelé avec un seul argument comme celui-ci, FD recherche le répertoire actuel récursivement pour toutes les entrées qui contiennent le modèle netfl
.
Le modèle de recherche est traité comme une expression régulière. Ici, nous recherchons des entrées qui commencent par x
et se terminent par rc
:
> cd /etc
> fd ' ^x.*rc$ '
X11/xinit/xinitrc
X11/xinit/xserverrc
La syntaxe d'expression régulière utilisée par fd
est documentée ici.
Si nous voulons rechercher un répertoire spécifique, il peut être donné comme deuxième argument à FD :
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
La FD peut être appelée sans arguments. Ceci est très utile pour obtenir un aperçu rapide de toutes les entrées dans le répertoire actuel, récursivement (similaire à ls -R
):
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
Si vous souhaitez utiliser cette fonctionnalité pour répertorier tous les fichiers dans un répertoire donné, vous devez utiliser un modèle Catch-All tel que .
ou ^
:
> fd . fd/tests/
testenv
testenv/mod.rs
tests.rs
Souvent, nous sommes intéressés par tous les fichiers d'un type particulier. Cela peut être fait avec l'option -e
(ou --extension
). Ici, nous recherchons tous les fichiers Markdown dans le référentiel FD:
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
L'option -e
peut être utilisée en combinaison avec un modèle de recherche:
> fd -e rs mod
src/fshelper/mod.rs
src/lscolors/mod.rs
tests/testenv/mod.rs
Pour trouver des fichiers avec exactement le modèle de recherche fourni, utilisez l'option -g
(ou --glob
):
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
Par défaut, FD ne recherche pas les répertoires cachés et n'affiche pas de fichiers cachés dans les résultats de recherche. Pour désactiver ce comportement, nous pouvons utiliser l'option -H
(ou --hidden
):
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
Si nous travaillons dans un répertoire qui est un référentiel GIT (ou comprend des référentiels GIT), FD ne recherche pas les dossiers (et n'affiche pas de fichiers) qui correspondent à l'un des modèles .gitignore
. Pour désactiver ce comportement, nous pouvons utiliser l'option -I
(ou --no-ignore
):
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
Pour vraiment rechercher tous les fichiers et répertoires, combinez simplement les fonctionnalités cachées et ignorées pour tout afficher ( -HI
) ou utiliser -u
/ --unrestricted
.
Par défaut, FD correspond uniquement au nom de fichier de chaque fichier. Cependant, en utilisant l'option --full-path
ou -p
, vous pouvez faire correspondre le chemin complet.
> fd -p -g ' **/.git/config '
> fd -p ' .*/lesson-d+/[a-z]+.(jpg|png) '
Au lieu de simplement montrer les résultats de la recherche, vous voulez souvent faire quelque chose avec eux. fd
fournit deux façons d'exécuter des commandes externes pour chacun de vos résultats de recherche:
-x
/ --exec
exécute une commande externe pour chacun des résultats de recherche (en parallèle).-X
/ --exec-batch
lance la commande externe une fois, avec tous les résultats de recherche comme arguments . Trouvez de manière récursive toutes les archives zip et déballez-les:
fd -e zip -x unzip
S'il y a deux de ces fichiers, file1.zip
et backup/file2.zip
, cela exécuterait unzip file1.zip
et unzip backup/file2.zip
. Les deux processus unzip
s'exécutent en parallèle (si les fichiers sont trouvés assez rapidement).
Trouvez tous les fichiers *.h
et *.cpp
et les format automatiquement en place avec clang-format -i
:
fd -e h -e cpp -x clang-format -i
Notez comment l'option -i
à clang-format
peut être transmise en tant qu'argument distinct. C'est pourquoi nous avons mis l'option -x
en dernier.
Trouvez tous test_*.py
et ouvrez-les dans votre éditeur préféré:
fd -g ' test_*.py ' -X vim
Notez que nous utilisons Capital -X
ici pour ouvrir une seule instance vim
. S'il y a deux de ces fichiers, test_basic.py
et lib/test_advanced.py
, cela exécutera vim test_basic.py lib/test_advanced.py
.
Pour voir des détails comme les autorisations de fichiers, les propriétaires, les tailles de fichiers, etc., vous pouvez dire fd
de les afficher en exécutant ls
pour chaque résultat:
fd … -X ls -lhd --color=always
Ce modèle est si utile que fd
fournit un raccourci. Vous pouvez utiliser l'option -l
/ --list-details
pour exécuter ls
de cette manière: fd … -l
.
L'option -X
est également utile lors de la combinaison fd
avec Ripgrep ( rg
) afin de rechercher dans une certaine classe de fichiers, comme tous les fichiers source C ++:
fd -e cpp -e cxx -e h -e hpp -X rg ' std::cout '
Convertir tous les fichiers *.jpg
en fichiers *.png
:
fd -e jpg -x convert {} {.}.png
Ici, {}
est un espace réservé pour le résultat de la recherche. {.}
est le même, sans l'extension de fichier. Voir ci-dessous pour plus de détails sur la syntaxe de l'espace réservé.
La sortie du terminal des commandes exécutée à partir de threads parallèles à l'aide -x
ne sera pas entrelacée ou brouillé, donc fd -x
peut être utilisé pour paralléliser rudimentairement une tâche exécutée sur de nombreux fichiers. Un exemple de ceci est le calcul de la somme de contrôle de chaque fichier individuel dans un répertoire.
fd -tf -x md5sum > file_checksums.txt
Les options -x
et -X
prennent un modèle de commande comme une série d'arguments (au lieu d'une seule chaîne). Si vous souhaitez ajouter des options supplémentaires à fd
après le modèle de commande, vous pouvez le terminer avec A ;
.
La syntaxe pour la génération de commandes est similaire à celle de GNU parallèle:
{}
: Un jeton d'espace charge qui sera remplacé par le chemin du résultat de la recherche ( documents/images/party.jpg
).{.}
: Comme {}
, mais sans l'extension de fichier ( documents/images/party
).{/}
: Un espace réservé qui sera remplacé par le nom de base du résultat de la recherche ( party.jpg
).{//}
: le parent du chemin découvert ( documents/images
).{/.}
: Le nom de base, avec l'extension supprimée ( party
). Si vous n'incluez pas d'espace réservé, FD ajoute automatiquement un {}
à la fin.
Pour -x
/ --exec
, vous pouvez contrôler le nombre de travaux parallèles en utilisant l'option -j
/ --threads
. Use --threads=1
pour l'exécution en série.
Parfois, nous voulons ignorer les résultats de recherche d'un sous-répertoire spécifique. Par exemple, nous pourrions vouloir rechercher tous les fichiers et répertoires cachés ( -H
), mais exclure toutes les correspondances des répertoires .git
. Nous pouvons utiliser l'option -E
(ou --exclude
) pour cela. Il faut un modèle de glob arbitraire comme argument:
> fd -H -E .git …
Nous pouvons également l'utiliser pour sauter les répertoires montés:
> fd -E /mnt/external-drive …
.. ou pour sauter certains types de fichiers:
> fd -E ' *.bak ' …
Pour faire des motifs d'exclusion comme ceux-ci permanents, vous pouvez créer un fichier .fdignore
. Ils fonctionnent comme des fichiers .gitignore
, mais sont spécifiques à fd
. Par exemple:
> cat ~ /.fdignore
/mnt/external-drive
* .bak
Note
fd
prend également en charge les fichiers .ignore
utilisés par d'autres programmes tels que rg
ou ag
.
Si vous voulez que fd
ignore ces modèles à l'échelle mondiale, vous pouvez les mettre dans le fichier Global Ignore de fd
. Ceci est généralement situé dans ~/.config/fd/ignore
dans macOS ou Linux, et %APPDATA%fdignore
dans Windows.
Vous souhaiterez peut-être inclure .git/
dans votre fichier fd/ignore
afin que les répertoires .git
, et leur contenu ne soit pas inclus dans la sortie si vous utilisez l'option --hidden
.
Vous pouvez utiliser fd
pour supprimer tous les fichiers et répertoires qui sont assortis par votre modèle de recherche. Si vous souhaitez seulement supprimer des fichiers, vous pouvez utiliser l'option --exec-batch
/ -X
pour appeler rm
. Par exemple, pour supprimer récursivement tous les fichiers .DS_Store
, exécutez:
> fd -H ' ^.DS_Store$ ' -tf -X rm
Si vous n'êtes pas sûr, appelez toujours fd
sans -X rm
en premier. Alternativement, utilisez l'option "interactive" rm
S:
> fd -H ' ^.DS_Store$ ' -tf -X rm -i
Si vous souhaitez également supprimer une certaine classe de répertoires, vous pouvez utiliser la même technique. Vous devrez utiliser le drapeau rm
S --recursive
/ -r
pour supprimer les répertoires.
Note
Il existe des scénarios où l'utilisation fd … -X rm -r
peut provoquer des conditions de course: si vous avez un chemin comme …/foo/bar/foo/…
et que vous souhaitez supprimer tous les répertoires nommés foo
, vous pouvez vous retrouver dans une situation où la Le répertoire foo
extérieur est supprimé en premier, conduisant à (inoffensif) "'foo / bar / foo': pas de tels fichiers ou répertoires" des erreurs dans l'appel rm
.
Ceci est la sortie de fd -h
. Pour voir l'ensemble complet des options de ligne de commande, utilisez fd --help
qui comprend également un texte d'aide beaucoup plus détaillé.
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
Recherchons mon dossier à domicile pour les fichiers qui se terminent par [0-9].jpg
. Il contient ~ 750 000 sous-répertoires et environ 4 millions de fichiers. Pour la moyenne et l'analyse statistique, j'utilise Hyperfine. Les repères suivants sont effectués avec un cache disque "chaud" / pré-rempli (les résultats pour un cache disque "froid" montrent les mêmes tendances).
Commençons par 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
est beaucoup plus rapide s'il n'a pas besoin d'effectuer une recherche d'expression régulière:
Benchmark 2: find ~ -iname '*[0-9].jpg'
Time (mean ± σ): 11.226 s ± 0.104 s
Range (min … max): 11.119 s … 11.466 s
Essayons maintenant la même chose pour fd
. Notez que fd
effectue une recherche d'expression régulière par défaut. L'option Options -u
/ --unrestricted
est nécessaire ici pour une comparaison équitable. Sinon, fd
n'a pas à traverser les dossiers cachés et les chemins ignorés (voir ci-dessous):
Benchmark 3: fd -u '[0-9].jpg$' ~
Time (mean ± σ): 854.8 ms ± 10.0 ms
Range (min … max): 839.2 ms … 868.9 ms
Pour cet exemple particulier, fd
est environ 23 fois plus rapide que find -iregex
et environ 13 fois plus rapide que find -iname
. Soit dit en passant, les deux outils ont trouvé exactement les mêmes 546 fichiers ?.
Remarque : Il s'agit d'une référence particulière sur une machine particulière . Bien que nous ayons effectué beaucoup de tests différents (et trouvé des résultats cohérents), les choses pourraient être différentes pour vous! Nous encourageons tout le monde à l'essayer seul. Voir ce référentiel pour tous les scripts nécessaires.
En ce qui concerne la vitesse de FD , beaucoup de crédit vont au regex
et ignore
les caisses qui sont également utilisées dans Ripgrep (vérifiez-le!).
fd
ne trouve pas mon fichier! N'oubliez pas que fd
ignore les répertoires et les fichiers cachés par défaut. Il ignore également les modèles des fichiers .gitignore
. Si vous souhaitez vous assurer de trouver absolument tous les fichiers possibles, utilisez toujours l'option Options -u
/ --unrestricted
(ou -HI
pour activer les fichiers cachés et ignorés):
> fd -u …
fd
peut colorer les fichiers par extension, tout comme ls
. Pour que cela fonctionne, la variable d'environnement LS_COLORS
doit être définie. En règle générale, la valeur de cette variable est définie par la commande dircolors
qui fournit un format de configuration pratique pour définir les couleurs pour différents formats de fichiers. Dans la plupart des distributions, LS_COLORS
doit déjà être défini. Si vous êtes sous Windows ou si vous recherchez des variantes alternatives, plus complètes (ou plus colorées), consultez ici, ici ou ici.
fd
honore également la variable d'environnement NO_COLOR
.
fd
ne semble pas interpréter correctement mon modèle regex Beaucoup de caractères regex spéciaux (comme []
, ^
, $
, ..) sont également des caractères spéciaux dans votre coquille. En cas de doute, assurez-vous toujours de mettre des citations simples autour du motif Regex:
> fd ' ^[A-Z][0-9]+$ '
Si votre modèle commence par un tableau de bord, vous devez ajouter --
pour signaler les options de fin de ligne de commande. Sinon, le modèle sera interprété comme une option de ligne de commande. Alternativement, utilisez une classe de caractères avec un seul trait d'union:
> fd -- ' -pattern '
> fd ' [-]pattern '
alias
ou de shell Les fonctions alias
shell ES et Shell ne peuvent pas être utilisées pour l'exécution de la commande via fd -x
ou fd -X
. Dans zsh
, vous pouvez faire de l'alias global via alias -g myalias="…"
. Dans bash
, vous pouvez utiliser export -f my_function
pour mettre à la disposition des processus enfants. Vous auriez toujours besoin d'appeler fd -x bash -c 'my_function "$1"' bash
. Pour d'autres cas d'utilisation ou shells, utilisez un script shell (temporaire).
fzf
Vous pouvez utiliser FD pour générer des entrées pour la ligne de commande Fuzzy Finder FZF:
export FZF_DEFAULT_COMMAND= ' fd --type file '
export FZF_CTRL_T_COMMAND= " $FZF_DEFAULT_COMMAND "
Ensuite, vous pouvez taper vim <Ctrl-T>
sur votre terminal pour ouvrir FZF et rechercher dans les résults FD.
Alternativement, vous aimerez peut-être suivre les liens symboliques et inclure des fichiers cachés (mais exclure les dossiers .git
):
export FZF_DEFAULT_COMMAND= ' fd --type file --follow --hidden --exclude .git '
Vous pouvez même utiliser la sortie colorée de FD à l'intérieur de FZF en réglant:
export FZF_DEFAULT_COMMAND= " fd --type file --color=always "
export FZF_DEFAULT_OPTS= " --ansi "
Pour plus de détails, consultez la section Tips du FZF Readme.
rofi
ROFI est une application de menu de lancement graphique qui est capable de créer des menus en lisant à partir de STDIN . La sortie fd
de tuyauterie en mode rofi
S -dmenu
crée des listes floues et répertoires et répertoires.
Créez une liste multi-sélection consultable insensible à cas de fichiers PDF dans votre répertoire $HOME
et ouvrez la sélection avec votre visionneuse PDF configurée. Pour répertorier tous les types de fichiers, supprimez l'argument -e pdf
.
fd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}
Pour modifier la liste présentée par ROFI, ajoutez des arguments à la commande fd
. Pour modifier le comportement de recherche de ROFI, ajoutez des arguments à la commande rofi
.
emacs
Le package EMACS Find-File-in-Project peut utiliser FD pour trouver des fichiers.
Après avoir installé find-file-in-project
, ajoutez la ligne (setq ffip-use-rust-fd t)
à votre fichier ~/.emacs
ou ~/.emacs.d/init.el
Dans EMACS, exécutez Mx find-file-in-project-by-selected
pour trouver des fichiers correspondants. Alternativement, exécutez Mx find-file-in-project
pour répertorier tous les fichiers disponibles dans le projet.
Pour formater la sortie de fd
sous forme de fichier, vous pouvez utiliser la commande tree
--fromfile
:
❯ fd | tree --fromfile
Cela peut être plus utile que l'exécution de tree
en soi car tree
n'ignore aucun fichier par défaut, et il ne supporte pas non plus un ensemble d'options riches que fd
pour contrôler quoi imprimer:
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
Sur bash et similaire, vous pouvez simplement créer un alias:
❯ alias as-tree= ' tree --fromfile '
xargs
ou parallel
Notez que fd
a une fonctionnalité intégrée pour l'exécution de commandes avec ses options -x
/ --exec
et -X
/ --exec-batch
. Si vous préférez, vous pouvez toujours l'utiliser en combinaison avec xargs
:
> fd -0 -e rs | xargs -0 wc -l
Ici, l'option -0
indique à FD de séparer les résultats de recherche par le caractère nul (au lieu de Newlines). De la même manière, l'option -0
de xargs
lui indique de lire l'entrée de cette manière.
... et d'autres distributions Linux basées à Debian.
Si vous exécutez Ubuntu 19.04 (Disco Dingo) ou plus récent, vous pouvez installer le forfait officiellement entretenu:
apt install fd-find
Notez que le binaire est appelé fdfind
car le nom binaire fd
est déjà utilisé par un autre package. Il est recommandé qu'après l'installation, vous ajoutez un lien à fd
en exécutant la commande ln -s $(which fdfind) ~/.local/bin/fd
, afin d'utiliser fd
de la même manière que dans cette documentation. Assurez-vous que $HOME/.local/bin
est dans votre $PATH
.
Si vous utilisez une ancienne version d'Ubuntu, vous pouvez télécharger le dernier package .deb
à partir de la page de version et l'installer via:
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
Notez que les packages .Deb sur la page de version de ce projet nomment toujours l'exécutable fd
.
Si vous dirigez Debian Buster ou plus récent, vous pouvez installer le forfait Debian officiellement entretenu:
apt-get install fd-find
Notez que le binaire est appelé fdfind
car le nom binaire fd
est déjà utilisé par un autre package. Il est recommandé qu'après l'installation, vous ajoutez un lien à fd
en exécutant la commande ln -s $(which fdfind) ~/.local/bin/fd
, afin d'utiliser fd
de la même manière que dans cette documentation. Assurez-vous que $HOME/.local/bin
est dans votre $PATH
.
Notez que les packages .Deb sur la page de version de ce projet nomment toujours l'exécutable fd
.
En commençant par Fedora 28, vous pouvez installer fd
à partir des sources officielles du package:
dnf install fd-find
Vous pouvez installer le package FD à partir des sources officielles, à condition que le référentiel approprié soit activé:
apk add fd
Vous pouvez installer le package FD à partir des repos officiels:
pacman -S fd
Vous pouvez également installer FD à partir de l'AUR.
Vous pouvez utiliser le FD Ebuild à partir du dépôt officiel:
emerge -av fd
Vous pouvez installer le package FD à partir du dépôt officiel:
zypper in fd
Vous pouvez installer fd
via XBPS-stall:
xbps-install -S fd
Vous pouvez installer le package FD à partir du dépôt officiel:
apt-get install fd
Vous pouvez installer le package FD à partir du dépôt officiel:
eopkg install fd
Vous pouvez installer le package fd
à partir de Fedora COPR.
dnf copr enable tkbcopr/fd
dnf install fd
Une version différente utilisant le Malloc plus lent au lieu de Jemalloc est également disponible à partir du repo EPEL8 / 9 en tant que fd-find
FD.
Vous pouvez installer fd
avec Homebrew:
brew install fd
… Ou avec Macports:
port install fd
Vous pouvez télécharger des binaires prédéfinis à partir de la page de version.
Alternativement, vous pouvez installer fd
via Scoop:
scoop install fd
Ou via le chocolat:
choco install fd
Ou via Winget:
winget install sharkdp.fd
Vous pouvez installer le package FD à partir du dépôt officiel:
guix install fd
Vous pouvez utiliser le gestionnaire de packages NIX pour installer fd
:
nix-env -i fd
Vous pouvez utiliser Flox pour installer fd
dans un environnement Flox:
flox install fd
Vous pouvez installer le package FD-Find à partir du dépôt officiel:
pkg install fd-find
Sur Linux et MacOS, vous pouvez installer le package FD-Find:
npm install -g fd-find
Avec la cargaison de gestionnaire de package de Rust, vous pouvez installer FD via:
cargo install fd-find
Notez que Rust Version 1.77.2 ou ultérieure est requise.
make
est également nécessaire pour la construction.
La page de libération comprend des binaires précompilés pour Linux, MacOS et Windows. Des binaires liés statiquement sont également disponibles: recherchez des archives avec musl
dans le nom du fichier.
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
est distribué en vertu des termes de la licence MIT et de la licence Apache 2.0.
Consultez les fichiers de licence et de licence de licence pour les détails de la licence.