[中文] [한국어]
fd
es un programa para encontrar entradas en su sistema de archivos. Es una alternativa simple, rápida y fácil de usar para find
. Si bien no tiene como objetivo respaldar toda la poderosa funcionalidad de find
, proporciona valores predeterminados sensibles (obstinados) para la mayoría de los casos de uso.
Instalación • Cómo usar • Solución de problemas
fd PATTERN
en lugar de find -iname '*PATTERN*'
.ls
)..gitignore
, por defecto.find
:-). Primero, para obtener una descripción general de todas las opciones de línea de comandos disponibles, puede ejecutar fd -h
para un mensaje de ayuda conciso o fd --help
para una versión más detallada.
FD está diseñado para encontrar entradas en su sistema de archivos. La búsqueda más básica que puede realizar es ejecutar FD con un solo argumento: el patrón de búsqueda. Por ejemplo, suponga que desea encontrar un script suyo (el nombre incluyó netflix
):
> fd netfl
Software/python/imdb-ratings/netflix-details.py
Si se llama con un solo argumento como este, FD busca el directorio actual recursivamente para cualquier entrada que contenga el patrón netfl
.
El patrón de búsqueda se trata como una expresión regular. Aquí, buscamos entradas que comiencen con x
y terminemos con rc
:
> cd /etc
> fd ' ^x.*rc$ '
X11/xinit/xinitrc
X11/xinit/xserverrc
La sintaxis de expresión regular utilizada por fd
se documenta aquí.
Si queremos buscar en un directorio específico, se puede dar como segundo argumento a FD :
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
FD puede llamarse sin argumentos. Esto es muy útil para obtener una visión general rápida de todas las entradas en el directorio actual, recursivamente (similar a ls -R
):
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
Si desea usar esta funcionalidad para enumerar todos los archivos en un directorio determinado, debe usar un patrón de atrapar todo como .
o ^
:
> fd . fd/tests/
testenv
testenv/mod.rs
tests.rs
A menudo, estamos interesados en todos los archivos de un tipo particular. Esto se puede hacer con la opción -e
(o --extension
). Aquí, buscamos todos los archivos de Markdown en el repositorio de FD:
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
La opción -e
se puede usar en combinación con un patrón de búsqueda:
> fd -e rs mod
src/fshelper/mod.rs
src/lscolors/mod.rs
tests/testenv/mod.rs
Para encontrar archivos con exactamente el patrón de búsqueda proporcionado, use la opción -g
(o --glob
):
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
Por defecto, FD no busca directorios ocultos y no muestra archivos ocultos en los resultados de búsqueda. Para deshabilitar este comportamiento, podemos usar la opción -H
(o --hidden
):
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
Si trabajamos en un directorio que es un repositorio GIT (o incluye repositorios Git), FD no busca carpetas (y no muestra archivos) que coincidan con uno de los patrones .gitignore
. Para deshabilitar este comportamiento, podemos usar la opción -I
(o --no-ignore
):
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
Para buscar realmente todos los archivos y directorios, simplemente combine las características ocultas e ignoras para mostrar todo ( -HI
) o usar -u
/ --unrestricted
.
Por defecto, FD solo coincide con el nombre de archivo de cada archivo. Sin embargo, usando la opción --full-path
o -p
, puede coincidir con la ruta completa.
> fd -p -g ' **/.git/config '
> fd -p ' .*/lesson-d+/[a-z]+.(jpg|png) '
En lugar de solo mostrar los resultados de búsqueda, a menudo desea hacer algo con ellos. fd
proporciona dos formas de ejecutar comandos externos para cada uno de sus resultados de búsqueda:
-x
/ --exec
ejecuta un comando externo para cada uno de los resultados de búsqueda (en paralelo).-X
/ --exec-batch
inicia el comando externo una vez, con todos los resultados de búsqueda como argumentos . Encontrar recursivamente todos los archivos zip y desempaquetarlos:
fd -e zip -x unzip
Si hay dos de estos archivos, file1.zip
y backup/file2.zip
, esto ejecutaría unzip file1.zip
y unzip backup/file2.zip
. Los dos procesos unzip
se ejecutan en paralelo (si los archivos se encuentran lo suficientemente rápido).
Encuentre todos los archivos *.h
y *.cpp
y los formateares automáticamente en el lugar con clang-format -i
:
fd -e h -e cpp -x clang-format -i
Tenga en cuenta cómo se puede pasar la opción -i
para clang-format
como un argumento separado. Es por eso que pusimos la opción -x
al final.
Encuentre todos los archivos test_*.py
y ábralos en su editor favorito:
fd -g ' test_*.py ' -X vim
Tenga en cuenta que usamos Capital -X
aquí para abrir una sola instancia vim
. Si hay dos de estos archivos, test_basic.py
y lib/test_advanced.py
, se ejecutará vim test_basic.py lib/test_advanced.py
.
Para ver detalles como permisos de archivos, propietarios, tamaños de archivo, etc., puede decirle fd
que los muestre ejecutando ls
para cada resultado:
fd … -X ls -lhd --color=always
Este patrón es tan útil que fd
proporciona un atajo. Puede usar la opción -l
/ --list-details
para ejecutar ls
de esta manera: fd … -l
.
La opción -X
también es útil al combinar fd
con RipGrep ( rg
) para buscar dentro de una determinada clase de archivos, como todos los archivos de origen C ++:
fd -e cpp -e cxx -e h -e hpp -X rg ' std::cout '
Convertir todos los archivos *.jpg
a *.png
archivos:
fd -e jpg -x convert {} {.}.png
Aquí, {}
es un marcador de posición para el resultado de la búsqueda. {.}
es lo mismo, sin la extensión del archivo. Vea a continuación para obtener más detalles sobre la sintaxis del marcador de posición.
La salida del terminal de los comandos ejecutados desde subprocesos paralelos usando -x
no se entrelazará ni se confunde, por lo que fd -x
puede usarse para paralelizar rudimentadamente una tarea que se ejecuta en muchos archivos. Un ejemplo de esto es calcular la suma de verificación de cada archivo individual dentro de un directorio.
fd -tf -x md5sum > file_checksums.txt
Las opciones -x
y -X
toman una plantilla de comando como una serie de argumentos (en lugar de una sola cadena). Si desea agregar opciones adicionales a fd
después de la plantilla de comando, puede finalizarla con A ;
.
La sintaxis para generar comandos es similar a la de GNU paralelo:
{}
: Un token de marcador de posición que se reemplazará con la ruta del resultado de la búsqueda ( documents/images/party.jpg
).{.}
: Me gusta {}
, pero sin la extensión del archivo ( documents/images/party
).{/}
: Un marcador de posición que será reemplazado por el nombre de base del resultado de la búsqueda ( party.jpg
).{//}
: el padre de la ruta descubierta ( documents/images
).{/.}
: El nombre de base, con la extensión eliminada ( party
). Si no incluye un marcador de posición, FD agrega automáticamente un {}
al final.
Para -x
/ --exec
, puede controlar el número de trabajos paralelos utilizando la opción -j
/ --threads
. Use --threads=1
para la ejecución serie.
A veces queremos ignorar los resultados de búsqueda de un subdirectorio específico. Por ejemplo, es posible que deseemos buscar todos los archivos y directorios ocultos ( -H
), pero excluir todas las coincidencias de los directorios .git
. Podemos usar la opción -E
(o --exclude
) para esto. Se necesita un patrón de globo arbitrario como argumento:
> fd -H -E .git …
También podemos usar esto para omitir directorios montados:
> fd -E /mnt/external-drive …
.. o para omitir ciertos tipos de archivos:
> fd -E ' *.bak ' …
Para excluir los patrones como estos permanentes, puede crear un archivo .fdignore
. Funcionan como archivos .gitignore
, pero son específicos para fd
. Por ejemplo:
> cat ~ /.fdignore
/mnt/external-drive
* .bak
Nota
fd
también es compatible con los archivos .ignore
que utilizan otros programas como rg
o ag
.
Si desea que fd
ignore estos patrones a nivel mundial, puede colocarlos en el archivo de Ignore Global de fd
. Esto generalmente se encuentra en ~/.config/fd/ignore
en macOS o Linux, y %APPDATA%fdignore
en Windows.
Es posible que desee incluir .git/
en su archivo fd/ignore
para que los directorios .git
, y su contenido no se incluya en la salida si usa la opción --hidden
.
Puede usar fd
para eliminar todos los archivos y directorios que coinciden con su patrón de búsqueda. Si solo desea eliminar archivos, puede usar la opción --exec-batch
/ -X
para llamar rm
. Por ejemplo, para eliminar recursivamente todos los archivos .DS_Store
, ejecutar:
> fd -H ' ^.DS_Store$ ' -tf -X rm
Si no está seguro, siempre llame fd
sin -X rm
primero. Alternativamente, use la opción "interactiva" de rm
S:
> fd -H ' ^.DS_Store$ ' -tf -X rm -i
Si también desea eliminar una determinada clase de directorios, puede usar la misma técnica. Tendrá que usar la bandera rm
S --recursive
/ -r
para eliminar los directorios.
Nota
Hay escenarios en los que usar fd … -X rm -r
puede causar condiciones de carrera: si tiene una ruta como …/foo/bar/foo/…
y desea eliminar todos los directorios llamados foo
, puede terminar en una situación en la que El directorio externo foo
se elimina primero, lo que lleva a (inofensivos) los errores "'foo/bar/foo': no tal archivo o directorio" en la llamada rm
.
Esta es la salida de fd -h
. Para ver el conjunto completo de opciones de línea de comandos, use fd --help
que también incluye un texto de ayuda mucho más detallado.
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
Busquemos en mi carpeta de inicio los archivos que terminan en [0-9].jpg
. Contiene ~ 750.000 subdirectorios y alrededor de 4 millones de archivos. Para el promedio y el análisis estadístico, estoy usando Hyperfine. Los siguientes puntos de referencia se realizan con un caché de disco "cálido"/pre-relleno (los resultados para un caché de disco "frío" muestran las mismas tendencias).
Comencemos con 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
es mucho más rápido si no necesita realizar una búsqueda de expresión regular:
Benchmark 2: find ~ -iname '*[0-9].jpg'
Time (mean ± σ): 11.226 s ± 0.104 s
Range (min … max): 11.119 s … 11.466 s
Ahora intentemos lo mismo para fd
. Tenga en cuenta que fd
realiza una búsqueda de expresión regular de forma predeterminada. La opción de opciones -u
/ --unrestricted
se necesita aquí para una comparación justa. De lo contrario, fd
no tiene que atravesar las carpetas ocultas y las rutas ignoradas (ver más abajo):
Benchmark 3: fd -u '[0-9].jpg$' ~
Time (mean ± σ): 854.8 ms ± 10.0 ms
Range (min … max): 839.2 ms … 868.9 ms
Para este ejemplo en particular, fd
es aproximadamente 23 veces más rápido que find -iregex
y aproximadamente 13 veces más rápido que find -iname
. Por cierto, ambas herramientas encontraron exactamente los mismos 546 archivos?
Nota : Este es un punto de referencia en particular en una máquina en particular . Si bien hemos realizado muchas pruebas diferentes (y encontramos resultados consistentes), ¡las cosas pueden ser diferentes para usted! Alentamos a todos a probarlo por su cuenta. Vea este repositorio para todos los scripts necesarios.
Con respecto a la velocidad de FD , mucho crédito va a la regex
e ignore
las cajas que también se usan en RipGrep (¡échale un vistazo!).
fd
no encuentra mi archivo! Recuerde que fd
ignora los directorios y archivos ocultos de forma predeterminada. También ignora los patrones de los archivos .gitignore
. Si desea asegurarse de encontrar absolutamente todos los archivos posibles, siempre use la opción Opciones -u
/ --unrestricted
(o -HI
para habilitar archivos ocultos e ignorados):
> fd -u …
fd
puede colorear archivos por extensión, al igual que ls
. Para que esto funcione, la variable de entorno LS_COLORS
debe establecerse. Por lo general, el valor de esta variable es establecido por el comando dircolors
que proporciona un formato de configuración conveniente para definir colores para diferentes formatos de archivo. En la mayoría de las distribuciones, LS_COLORS
ya debe estar configurado. Si está en Windows o si está buscando variantes alternativas, más completas (o más coloridas), vea aquí, aquí o aquí.
fd
también honra la variable de entorno NO_COLOR
.
fd
no parece interpretar mi patrón regex correctamente Muchos personajes especiales de regex (como []
, ^
, $
, ..) también son caracteres especiales en tu caparazón. En caso de duda, siempre asegúrese de colocar citas individuales alrededor del patrón regex:
> fd ' ^[A-Z][0-9]+$ '
Si su patrón comienza con un tablero, debe agregar --
para indicar las opciones de línea final de comando. De lo contrario, el patrón se interpretará como una opción de línea de comandos. Alternativamente, use una clase de caracteres con un solo carácter de guión:
> fd -- ' -pattern '
> fd ' [-]pattern '
alias
o shell Las funciones de shell alias
y shell no se pueden usar para la ejecución del comando a través de fd -x
o fd -X
. En zsh
, puedes hacer que el alias sea global a través de alias -g myalias="…"
. En bash
, puede usar export -f my_function
para poner a disposición de los procesos infantiles. Todavía necesitaría llamar fd -x bash -c 'my_function "$1"' bash
. Para otros casos de uso o conchas, use un script (temporal) de shell.
fzf
Puede usar FD para generar entrada para el buscador difuso de línea de comandos FZF:
export FZF_DEFAULT_COMMAND= ' fd --type file '
export FZF_CTRL_T_COMMAND= " $FZF_DEFAULT_COMMAND "
Luego, puede escribir vim <Ctrl-T>
en su terminal para abrir FZF y buscar a través de los resultados de FD.
Alternativamente, es posible que desee seguir enlaces simbólicos e incluir archivos ocultos (pero excluir carpetas .git
):
export FZF_DEFAULT_COMMAND= ' fd --type file --follow --hidden --exclude .git '
Incluso puede usar la salida de color de FD dentro de FZF configurando:
export FZF_DEFAULT_COMMAND= " fd --type file --color=always "
export FZF_DEFAULT_OPTS= " --ansi "
Para obtener más detalles, consulte la sección Consejos del ReadMe FZF.
rofi
ROFI es una aplicación de menú de lanzamiento gráfico que puede crear menús leyendo desde Stdin . La salida fd
de la tubería en el modo rofi
S -dmenu
crea listas de archivos y directorios de búsqueda difusa.
Cree una lista de archivos PDF de búsqueda de búsqueda insensible a una $HOME
. Para enumerar todos los tipos de archivos, deje caer el argumento -e pdf
.
fd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}
Para modificar la lista presentada por ROFI, agregue argumentos al comando fd
. Para modificar el comportamiento de búsqueda de ROFI, agregue argumentos al comando rofi
.
emacs
El paquete EMACS Find-File-in-Project puede usar FD para encontrar archivos.
Después de instalar find-file-in-project
, agregue la línea (setq ffip-use-rust-fd t)
a su archivo ~/.emacs
o ~/.emacs.d/init.el
.
En EMACS, ejecute Mx find-file-in-project-by-selected
para encontrar archivos coincidentes. Alternativamente, ejecute Mx find-file-in-project
para enumerar todos los archivos disponibles en el proyecto.
Para formatear la salida de fd
como un árbol de archivo, puede usar el comando tree
con --fromfile
:
❯ fd | tree --fromfile
Esto puede ser más útil que ejecutar tree
por sí mismo porque tree
no ignora ningún archivo de forma predeterminada, ni admite un conjunto de opciones rico como fd
para controlar qué imprimir:
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
En Bash y similar, simplemente puedes crear un alias:
❯ alias as-tree= ' tree --fromfile '
xargs
o parallel
Tenga en cuenta que fd
tiene una función Builtin para la ejecución de comandos con sus opciones -x
/ --exec
y -X
/ --exec-batch
. Si lo prefiere, aún puede usarlo en combinación con xargs
:
> fd -0 -e rs | xargs -0 wc -l
Aquí, la opción -0
le dice a FD que separe los resultados de búsqueda por el carácter nulo (en lugar de las nuevas líneas). De la misma manera, la opción -0
de xargs
le dice que lea la entrada de esta manera.
... y otras distribuciones de Linux con sede en Debian.
Si ejecuta Ubuntu 19.04 (Dingo Dingo) o más nuevo, puede instalar el paquete mantenido oficialmente:
apt install fd-find
Tenga en cuenta que el binario se llama fdfind
como el nombre binario fd
ya es utilizado por otro paquete. Se recomienda que después de la instalación, agregue un enlace a fd
ejecutando el comando ln -s $(which fdfind) ~/.local/bin/fd
, para usar fd
de la misma manera que en esta documentación. Asegúrese de que $HOME/.local/bin
esté en su $PATH
.
Si usa una versión anterior de Ubuntu, puede descargar el último paquete .deb
desde la página de lanzamiento e instalarla a través de:
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
Tenga en cuenta que los paquetes .deb en la página de lanzamiento para este proyecto aún nombran el fd
ejecutable.
Si ejecuta Debian Buster o más nuevo, puede instalar el paquete Debian mantenido oficialmente:
apt-get install fd-find
Tenga en cuenta que el binario se llama fdfind
como el nombre binario fd
ya es utilizado por otro paquete. Se recomienda que después de la instalación, agregue un enlace a fd
ejecutando el comando ln -s $(which fdfind) ~/.local/bin/fd
, para usar fd
de la misma manera que en esta documentación. Asegúrese de que $HOME/.local/bin
esté en su $PATH
.
Tenga en cuenta que los paquetes .deb en la página de lanzamiento para este proyecto aún nombran el fd
ejecutable.
Comenzando con Fedora 28, puede instalar fd
en las fuentes oficiales del paquete:
dnf install fd-find
Puede instalar el paquete FD de las fuentes oficiales, siempre que tenga habilitado el repositorio apropiado:
apk add fd
Puede instalar el paquete FD en los reposos oficiales:
pacman -S fd
También puede instalar FD desde el AUR.
Puede usar el FD Ebuild del repositorio oficial:
emerge -av fd
Puede instalar el paquete FD desde el repositorio oficial:
zypper in fd
Puede instalar fd
a través de XBPS Install:
xbps-install -S fd
Puede instalar el paquete FD desde el repositorio oficial:
apt-get install fd
Puede instalar el paquete FD desde el repositorio oficial:
eopkg install fd
Puede instalar el paquete fd
desde Fedora COPR.
dnf copr enable tkbcopr/fd
dnf install fd
Una versión diferente que usa el MALLOC más lento en lugar de Jemalloc también está disponible en el repositorio de EpEL8/9 como el paquete fd-find
.
Puede instalar fd
con HomeBrew:
brew install fd
... o con MacPorts:
port install fd
Puede descargar binarios preconstruidos desde la página de lanzamiento.
Alternativamente, puede instalar fd
a través de SCOOP:
scoop install fd
O a través de Chocolatey:
choco install fd
O a través de Winget:
winget install sharkdp.fd
Puede instalar el paquete FD desde el repositorio oficial:
guix install fd
Puede usar el Administrador de paquetes NIX para instalar fd
:
nix-env -i fd
Puede usar Flox para instalar fd
en un entorno Flox:
flox install fd
Puede instalar el paquete FD-Find desde el repositorio oficial:
pkg install fd-find
En Linux y MacOS, puede instalar el paquete FD-Find:
npm install -g fd-find
Con la carga de Manager de paquetes de Rust, puede instalar FD a través de:
cargo install fd-find
Tenga en cuenta que se requiere la versión de óxido 1.77.2 o posterior.
también es necesario make
para la construcción.
La página de lanzamiento incluye binarios precompilados para Linux, macOS y Windows. Los binarios vinculados a estadísticas también están disponibles: busque archivos con musl
en el nombre del archivo.
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
se distribuye bajo los términos de la licencia MIT y la licencia Apache 2.0.
Consulte los archivos de licencia-apache y de la licencia para los detalles de la licencia.