[中文] [한국어]
fd
é um programa para encontrar entradas no seu sistema de arquivos. É uma alternativa simples, rápida e fácil de find
. Embora não tenha como objetivo suportar toda a poderosa funcionalidade do find
, ele fornece padrões sensatos (opinativos) para a maioria dos casos de uso.
Instalação • Como usar • Solução de problemas
fd PATTERN
em vez de find -iname '*PATTERN*'
.ls
)..gitignore
, por padrão.find
:-). Primeiro, para obter uma visão geral de todas as opções de linha de comando disponíveis, você pode executar fd -h
para uma mensagem de ajuda concisa ou fd --help
para uma versão mais detalhada.
O FD foi projetado para encontrar entradas no seu sistema de arquivos. A pesquisa mais básica que você pode executar é executar o FD com um único argumento: o padrão de pesquisa. Por exemplo, suponha que você queira encontrar um script antigo (o nome incluído netflix
):
> fd netfl
Software/python/imdb-ratings/netflix-details.py
Se chamado com apenas um único argumento como esse, o FD pesquisa o diretório atual recursivamente para qualquer entradas que contenham o padrão netfl
.
O padrão de pesquisa é tratado como uma expressão regular. Aqui, pesquisamos entradas que começam com x
e terminam com rc
:
> cd /etc
> fd ' ^x.*rc$ '
X11/xinit/xinitrc
X11/xinit/xserverrc
A sintaxe de expressão regular usada pelo fd
está documentada aqui.
Se quisermos pesquisar um diretório específico, ele pode ser dado como um segundo argumento ao FD :
> fd passwd /etc
/etc/default/passwd
/etc/pam.d/passwd
/etc/passwd
O FD pode ser chamado sem argumentos. Isso é muito útil para obter uma rápida visão geral de todas as entradas no diretório atual, recursivamente (semelhante ao ls -R
):
> cd fd/tests
> fd
testenv
testenv/mod.rs
tests.rs
Se você deseja usar essa funcionalidade para listar todos os arquivos em um determinado diretório, você deve usar um padrão de captura como .
ou ^
:
> fd . fd/tests/
testenv
testenv/mod.rs
tests.rs
Muitas vezes, estamos interessados em todos os arquivos de um tipo específico. Isso pode ser feito com a opção -e
(ou --extension
). Aqui, pesquisamos todos os arquivos de marcação no repositório FD:
> cd fd
> fd -e md
CONTRIBUTING.md
README.md
A opção -e
pode ser usada em combinação com um padrão de pesquisa:
> fd -e rs mod
src/fshelper/mod.rs
src/lscolors/mod.rs
tests/testenv/mod.rs
Para encontrar arquivos com exatamente o padrão de pesquisa fornecido, use a opção -g
(ou --glob
):
> fd -g libc.so /usr
/usr/lib32/libc.so
/usr/lib/libc.so
Por padrão, o FD não pesquisa diretórios ocultos e não mostra arquivos ocultos nos resultados da pesquisa. Para desativar esse comportamento, podemos usar a opção -H
(ou --hidden
):
> fd pre-commit
> fd -H pre-commit
.git/hooks/pre-commit.sample
Se trabalharmos em um diretório que é um repositório Git (ou incluir repositórios Git), o FD não pesquisa pastas (e não mostra arquivos) que correspondem a um dos padrões .gitignore
. Para desativar esse comportamento, podemos usar a opção -I
(ou --no-ignore
):
> fd num_cpu
> fd -I num_cpu
target/debug/deps/libnum_cpus-f5ce7ef99006aa05.rlib
Para realmente pesquisar todos os arquivos e diretórios, basta combinar os recursos ocultos e ignorar para mostrar tudo ( -HI
) ou use -u
/ --unrestricted
.
Por padrão, o FD corresponde apenas ao nome do arquivo de cada arquivo. No entanto, usando a opção --full-path
ou -p
, você pode combinar com o caminho completo.
> fd -p -g ' **/.git/config '
> fd -p ' .*/lesson-d+/[a-z]+.(jpg|png) '
Em vez de apenas mostrar os resultados da pesquisa, você geralmente deseja fazer algo com eles. fd
fornece duas maneiras de executar comandos externos para cada um dos seus resultados de pesquisa:
-x
/ --exec
executa um comando externo para cada um dos resultados da pesquisa (em paralelo).-X
/ --exec-batch
inicia o comando externo uma vez, com todos os resultados da pesquisa como argumentos . Encontre recursivamente todos os arquivos do ZIP e descompacte -os:
fd -e zip -x unzip
Se houver dois desses arquivos, file1.zip
e backup/file2.zip
, isso executaria unzip file1.zip
e unzip backup/file2.zip
. Os dois processos unzip
são executados em paralelo (se os arquivos forem encontrados com rapidez suficiente).
Encontre todos os arquivos *.h
e *.cpp
e formem-os automaticamente no local com clang-format -i
:
fd -e h -e cpp -x clang-format -i
Observe como a opção -i
para clang-format
pode ser passada como um argumento separado. É por isso que colocamos a opção -x
em último.
Encontre todo test_*.py
e abra -os em seu editor favorito:
fd -g ' test_*.py ' -X vim
Observe que usamos Capital -X
aqui para abrir uma única instância vim
. Se houver dois desses arquivos, test_basic.py
e lib/test_advanced.py
, isso executará vim test_basic.py lib/test_advanced.py
.
Para ver detalhes como permissões de arquivos, proprietários, tamanhos de arquivo etc., você pode dizer fd
para mostrá -las executando ls
para cada resultado:
fd … -X ls -lhd --color=always
Esse padrão é tão útil que fd
fornece um atalho. Você pode usar a opção -l
/ --list-details
para executar ls
dessa maneira: fd … -l
.
A opção -X
também é útil ao combinar fd
com RipGrep ( rg
) para pesquisar em uma determinada classe de arquivos, como todos os arquivos de origem C ++:
fd -e cpp -e cxx -e h -e hpp -X rg ' std::cout '
Converta todos os arquivos *.jpg
em arquivos *.png
:
fd -e jpg -x convert {} {.}.png
Aqui, {}
é um espaço reservado para o resultado da pesquisa. {.}
é o mesmo, sem a extensão do arquivo. Veja abaixo para obter mais detalhes sobre a sintaxe do espaço reservado.
A saída do terminal dos comandos executados a partir de encadeamentos paralelos usando -x
não será entrelaçada ou iluminada; portanto, fd -x
pode ser usado para paralelizar rudimosamente uma tarefa executada em muitos arquivos. Um exemplo disso está calculando a soma de verificação de cada arquivo individual em um diretório.
fd -tf -x md5sum > file_checksums.txt
As opções -x
e -X
pegam um modelo de comando como uma série de argumentos (em vez de uma única string). Se você deseja adicionar opções adicionais ao fd
após o modelo de comando, poderá encerrá -lo com um ;
.
A sintaxe para gerar comandos é semelhante à de GNU paralela:
{}
: Um token de espaço reservado que será substituído pelo caminho do resultado da pesquisa ( documents/images/party.jpg
).{.}
: Como {}
, mas sem a extensão do arquivo ( documents/images/party
).{/}
: Um espaço reservado que será substituído pelo nome da base do resultado da pesquisa ( party.jpg
).{//}
: o pai do caminho descoberto ( documents/images
).{/.}
: O nome da base, com a extensão removida ( party
). Se você não incluir um espaço reservado, o FD adicionará automaticamente um {}
no final.
Para -x
/ --exec
, você pode controlar o número de trabalhos paralelos usando a opção -j
/ --threads
. Use --threads=1
para execução em série.
Às vezes, queremos ignorar os resultados da pesquisa de um subdiretório específico. Por exemplo, podemos querer pesquisar todos os arquivos e diretórios ocultos ( -H
), mas exclua todas as correspondências dos diretórios .git
. Podemos usar a opção -E
(ou --exclude
) para isso. É preciso um padrão de glob arbitrário como argumento:
> fd -H -E .git …
Também podemos usar isso para pular diretórios montados:
> fd -E /mnt/external-drive …
.. ou para pular certos tipos de arquivos:
> fd -E ' *.bak ' …
Para tornar os padrões excluídos como esses permanentes, você pode criar um arquivo .fdignore
. Eles trabalham como arquivos .gitignore
, mas são específicos para fd
. Por exemplo:
> cat ~ /.fdignore
/mnt/external-drive
* .bak
Observação
fd
também suporta arquivos .ignore
usados por outros programas como rg
ou ag
.
Se você deseja que fd
ignore esses padrões globalmente, você pode colocá -los no arquivo ignorado global da fd
. Isso geralmente está localizado em ~/.config/fd/ignore
no macOS ou linux, e %APPDATA%fdignore
no Windows.
Você pode incluir .git/
no seu arquivo fd/ignore
para que os diretórios .git
e o conteúdo deles não sejam incluídos na saída se você usar a opção --hidden
.
Você pode usar fd
para remover todos os arquivos e diretórios que correspondem ao seu padrão de pesquisa. Se você deseja remover apenas arquivos, poderá usar a opção --exec-batch
/ -X
para ligar para rm
. Por exemplo, para remover recursivamente todos os arquivos .DS_Store
, execute:
> fd -H ' ^.DS_Store$ ' -tf -X rm
Se você não tiver certeza, sempre ligue fd
sem -X rm
primeiro. Como alternativa, use a opção rm
S "Interactive":
> fd -H ' ^.DS_Store$ ' -tf -X rm -i
Se você também deseja remover uma determinada classe de diretórios, pode usar a mesma técnica. Você precisará usar o sinalizador rm
S --recursive
/ -r
para remover os diretórios.
Observação
Existem cenários em que o uso de fd … -X rm -r
pode causar condições de corrida: se você tem um caminho como …/foo/bar/foo/…
e deseja remover todos os diretórios chamados foo
, você pode acabar em uma situação em que o O diretório foo
externo é removido primeiro, levando a erros (inofensivos) "Foo/Bar/Foo": nenhum arquivo ou diretório " na chamada rm
.
Esta é a saída de fd -h
. Para ver o conjunto completo de opções de linha de comando, use fd --help
, que também inclui um texto de ajuda muito mais detalhado.
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
Vamos pesquisar minha pasta doméstica por arquivos que terminam em [0-9].jpg
. Ele contém ~ 750.000 subdiretos e cerca de 4 milhões de arquivos. Para análises médias e estatísticas, estou usando hiperfina. Os seguintes benchmarks são realizados com um cache de disco "quente"/pré-preenchido (os resultados para um cache de disco "frio" mostram as mesmas tendências).
Vamos começar com 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
é muito mais rápido se não precisar executar uma pesquisa de expressão 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
Agora vamos tentar o mesmo para fd
. Observe que fd
executa uma pesquisa de expressão regular por padrão. A opção Opções -u
/ --unrestricted
é necessária aqui para uma comparação justa. Caso contrário, fd
não precisa atravessar pastas ocultas e caminhos ignorados (veja abaixo):
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 exemplo em particular, fd
é aproximadamente 23 vezes mais rápido que find -iregex
e cerca de 13 vezes mais rápido que find -iname
. A propósito, as duas ferramentas encontraram exatamente os mesmos 546 arquivos ?.
Nota : Este é um benchmark específico em uma máquina específica . Embora tenhamos realizado muitos testes diferentes (e encontramos resultados consistentes), as coisas podem ser diferentes para você! Incentivamos todos a experimentar por conta própria. Veja este repositório para todos os scripts necessários.
Em relação à velocidade do FD , muito crédito vai para o regex
e ignore
caixas que também são usadas no Ripgrep (confira!).
fd
não encontra meu arquivo! Lembre -se de que fd
ignora diretórios e arquivos ocultos por padrão. Ele também ignora os padrões dos arquivos .gitignore
. Se você deseja encontrar absolutamente todos os arquivos possíveis, sempre use as opções -u
/ --unrestricted
opção (ou -HI
para ativar arquivos ocultos e ignorados):
> fd -u …
fd
pode colorizar arquivos por extensão, assim como ls
. Para que isso funcione, a variável de ambiente LS_COLORS
deve ser definida. Normalmente, o valor dessa variável é definido pelo comando dircolors
, que fornece um formato de configuração conveniente para definir cores para diferentes formatos de arquivo. Na maioria das distribuições, LS_COLORS
já devem estar definidos. Se você estiver no Windows ou estiver procurando variantes alternativas, mais completas (ou mais coloridas), veja aqui, aqui ou aqui.
fd
também homenageia a variável de ambiente NO_COLOR
.
fd
não parece interpretar meu padrão regex corretamente Muitos caracteres regex especiais (como []
, ^
, $
, ..) também são caracteres especiais em seu shell. Em caso de dúvida, sempre certifique -se de colocar citações únicas em torno do padrão Regex:
> fd ' ^[A-Z][0-9]+$ '
Se o seu padrão começar com um traço, você deverá adicionar --
para sinalizar o final das opções da linha de comando. Caso contrário, o padrão será interpretado como uma opção de linha de comando. Como alternativa, use uma classe de caracteres com um único caractere de hífen:
> fd -- ' -pattern '
> fd ' [-]pattern '
alias
ou funções de shell alias
de shell e funções de shell não podem ser usadas para execução de comando via fd -x
ou fd -X
. Em zsh
, você pode tornar o alias global via alias -g myalias="…"
. No bash
, você pode usar export -f my_function
para disponibilizar processos infantis. Você ainda precisaria ligar para fd -x bash -c 'my_function "$1"' bash
. Para outros casos de uso ou conchas, use um script de shell (temporário).
fzf
Você pode usar o FD para gerar entrada para o Fuzz Felter Fuzzy da linha de comando:
export FZF_DEFAULT_COMMAND= ' fd --type file '
export FZF_CTRL_T_COMMAND= " $FZF_DEFAULT_COMMAND "
Em seguida, você pode digitar vim <Ctrl-T>
no seu terminal para abrir o FZF e pesquisar os resultados FD.
Como alternativa, você pode seguir links simbólicos e incluir arquivos ocultos (mas exclua as pastas .git
):
export FZF_DEFAULT_COMMAND= ' fd --type file --follow --hidden --exclude .git '
Você pode até usar a saída colorida do FD dentro do FZF por configuração:
export FZF_DEFAULT_COMMAND= " fd --type file --color=always "
export FZF_DEFAULT_OPTS= " --ansi "
Para mais detalhes, consulte a seção Dicas do FZF ReadMe.
rofi
O ROFI é um aplicativo de menu de lançamento gráfico que pode criar menus lendo a partir do stdin . A saída fd
do tubulação no modo rofi
S -dmenu
cria listas de arquivos e diretórios pesquisáveis.
Crie uma lista de vários seletos pesquisáveis entre os arquivos PDF no diretório $HOME
e abra a seleção com o visualizador PDF configurado. Para listar todos os tipos de arquivos, solte o argumento -e pdf
.
fd --type f -e pdf . $HOME | rofi -keep-right -dmenu -i -p FILES -multi-select | xargs -I {} xdg-open {}
Para modificar a lista apresentada pelo ROFI, adicione argumentos ao comando fd
. Para modificar o comportamento de pesquisa do rofi, adicione argumentos ao comando rofi
.
emacs
O pacote EMACS Find-File-In-Project pode usar o FD para encontrar arquivos.
Após a instalação do projeto find-file-in-project
, adicione a linha (setq ffip-use-rust-fd t)
ao seu arquivo ~/.emacs
ou ~/.emacs.d/init.el
.
No EMACS, execute Mx find-file-in-project-by-selected
para encontrar arquivos correspondentes. Como alternativa, execute Mx find-file-in-project
para listar todos os arquivos disponíveis no projeto.
Para formatar a saída do fd
como uma árvore de arquivos, você pode usar o comando tree
com --fromfile
:
❯ fd | tree --fromfile
Isso pode ser mais útil do que executar tree
por si só, porque tree
não ignora nenhum arquivo por padrão, nem suporta um conjunto de opções como Rich, como fd
faz para controlar o que imprimir:
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
Em Bash e similar, você pode simplesmente criar um pseudônimo:
❯ alias as-tree= ' tree --fromfile '
xargs
ou parallel
Observe que fd
possui um recurso embutido para execução de comando com suas opções -x
/ --exec
e -X
/ --exec-batch
. Se preferir, você ainda pode usá -lo em combinação com xargs
:
> fd -0 -e rs | xargs -0 wc -l
Aqui, a opção -0
diz ao FD para separar os resultados da pesquisa pelo caractere nulo (em vez de newlines). Da mesma forma, a opção -0
do xargs
diz para ler a entrada dessa maneira.
... e outras distribuições Linux baseadas em Debian.
Se você executar o Ubuntu 19.04 (disco dingo) ou mais recente, poderá instalar o pacote oficialmente mantido:
apt install fd-find
Observe que o binário é chamado de fdfind
, pois o nome binário fd
já é usado por outro pacote. Recomenda -se que, após a instalação, você adicione um link ao fd
executando o comando ln -s $(which fdfind) ~/.local/bin/fd
, a fim de usar fd
da mesma maneira que nesta documentação. Certifique -se de que $HOME/.local/bin
esteja no seu $PATH
.
Se você usar uma versão mais antiga do Ubuntu, poderá fazer o download do mais recente pacote .deb
na página de lançamento e instalá -lo via:
dpkg -i fd_9.0.0_amd64.deb # adapt version number and architecture
Observe que os pacotes .deb na página de liberação deste projeto ainda nomeiam o fd
executável.
Se você administra o Debian Buster ou mais recente, poderá instalar o pacote Debian oficialmente mantido:
apt-get install fd-find
Observe que o binário é chamado de fdfind
, pois o nome binário fd
já é usado por outro pacote. Recomenda -se que, após a instalação, você adicione um link ao fd
executando o comando ln -s $(which fdfind) ~/.local/bin/fd
, a fim de usar fd
da mesma maneira que nesta documentação. Certifique -se de que $HOME/.local/bin
esteja no seu $PATH
.
Observe que os pacotes .deb na página de liberação deste projeto ainda nomeiam o fd
executável.
Começando com o Fedora 28, você pode instalar fd
das fontes oficiais de pacotes:
dnf install fd-find
Você pode instalar o pacote FD a partir das fontes oficiais, desde que você tenha o repositório apropriado ativado:
apk add fd
Você pode instalar o pacote FD a partir dos repositórios oficiais:
pacman -S fd
Você também pode instalar o FD a partir da AUR.
Você pode usar o FD Ebuild do repositório oficial:
emerge -av fd
Você pode instalar o pacote FD no repositório oficial:
zypper in fd
Você pode instalar fd
via XBPS-Install:
xbps-install -S fd
Você pode instalar o pacote FD no repositório oficial:
apt-get install fd
Você pode instalar o pacote FD no repositório oficial:
eopkg install fd
Você pode instalar o pacote fd
do Fedora Copr.
dnf copr enable tkbcopr/fd
dnf install fd
Uma versão diferente usando o Malloc mais lento em vez do Jemalloc também está disponível no repositório EPEL8/9 como o pacote fd-find
.
Você pode instalar fd
com homebrew:
brew install fd
… Ou com Macports:
port install fd
Você pode baixar binários pré-construídos na página de lançamento.
Como alternativa, você pode instalar fd
via Scoop:
scoop install fd
Ou via Chocolatey:
choco install fd
Ou via Winget:
winget install sharkdp.fd
Você pode instalar o pacote FD no repositório oficial:
guix install fd
Você pode usar o Nix Package Manager para instalar fd
:
nix-env -i fd
Você pode usar o Flox para instalar fd
em um ambiente Flox:
flox install fd
Você pode instalar o pacote FD-PIND no repositório oficial:
pkg install fd-find
No Linux e MacOS, você pode instalar o pacote FD-Find:
npm install -g fd-find
Com a carga do Rust's Package Manager, você pode instalar o FD via:
cargo install fd-find
Observe que a versão da ferrugem 1.77.2 ou posterior é necessária.
make
também é necessária para a construção.
A página de lançamento inclui binários pré -compilados para Linux, MacOS e Windows. Binários estaticamente ligados também estão disponíveis: Procure arquivos com musl
no nome do arquivo.
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
é distribuído nos termos da licença do MIT e da licença Apache 2.0.
Consulte os arquivos da licença e da licença para obter detalhes da licença.