[中文] [한국어]
fd
- это программа для поиска записей в вашей файловой системе. Это простая, быстрая и удобная альтернатива, чтобы find
. Хотя он не стремится поддержать все мощные функциональность find
, он обеспечивает разумные (самоуверенные) по умолчанию для большинства случаев использования.
Установка • Как использовать • Устранение неполадок
fd PATTERN
вместо find -iname '*PATTERN*'
.ls
)..gitignore
, по умолчанию.find
:-). Во -первых, чтобы получить обзор всех доступных параметров командной строки, вы можете либо запустить 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 :
> 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
(или --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
. Чтобы отключить такое поведение, мы можем использовать опцию -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
предоставляет два способа выполнения внешних команд для каждого из ваших результатов поиска:
-x
/ --exec
запускает внешнюю команду для каждого из результатов поиска (параллельно).-X
/ --exec-batch
запускает внешнюю команду один раз, со всеми результатами поиска в качестве аргументов . Рекурсивно найти все архивы на молнии и распаковать их:
fd -e zip -x unzip
Если есть два таких файла, file1.zip
и backup/file2.zip
, это выполнит unzip file1.zip
и unzip backup/file2.zip
. Два процесса unzip
работают параллельно (если файлы найдены достаточно быстро).
Найдите все *.h
и *.cpp
файлы и автоматически вкладывают их в место с clang-format -i
:
fd -e h -e cpp -x clang-format -i
Обратите внимание, как вариант -i
для clang-format
может быть передана как отдельный аргумент. Вот почему мы поместили опцию -x
в последний раз.
Найдите все test_*.py
-файлы и откройте их в своем любимом редакторе:
fd -g ' test_*.py ' -X vim
Обратите внимание, что мы используем капитал -X
здесь, чтобы открыть один экземпляр vim
. Если есть два таких файла, test_basic.py
и lib/test_advanced.py
, это запустит vim test_basic.py lib/test_advanced.py
.
Чтобы увидеть данные, такие как разрешения на файлы, владельцы, размеры файлов и т. Д., Вы можете сказать fd
, чтобы показать их, запустив ls
для каждого результата:
fd … -X ls -lhd --color=always
Этот шаблон настолько полезен, что fd
обеспечивает ярлык. Вы можете использовать опцию -l
/ --list-details
для выполнения ls
таким образом: fd … -l
.
Параметр -X
также полезна при сочетания fd
с Ripgrep ( rg
) для поиска в определенном классе файлов, как и все исходные файлы C ++:
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 Parallel:
{}
: Токен заполнителя, который будет заменен путем результата поиска ( 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
также поддерживает файлы .ignore
, которые используются другими программами, такими как rg
или ag
.
Если вы хотите, чтобы fd
игнорировал эти шаблоны во всем мире, вы можете поместить их в глобальный файл игнорирования fd
. Обычно это расположено в ~/.config/fd/ignore
в macOS или Linux, и %APPDATA%fdignore
в Windows.
Возможно, вы захотите включить .git/
в свой файл fd/ignore
чтобы каталоги .git
, а их содержимое не было включено в вывод, если вы используете опцию --hidden
.
Вы можете использовать fd
для удаления всех файлов и каталогов, которые соответствуют вашему шаблону поиска. Если вы хотите удалить файлы, вы можете использовать опцию --exec-batch
/ -X
для вызова rm
. Например, чтобы рекурсивно удалить все файлы .DS_Store
, запустите:
> fd -H ' ^.DS_Store$ ' -tf -X rm
Если вы не уверены, всегда называйте fd
без -X rm
в первую очередь. В качестве альтернативы, используйте параметр rm
S "Interactive":
> 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 подкаталогов и около 4 миллионов файлов. Для усреднения и статистического анализа я использую гипертон. Следующие тесты выполняются с «теплым»/предварительно заполненным дисковым кэшем (результаты для «холодного» дискового кеша показывают те же тенденции).
Начнем с 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
примерно в 23 раза быстрее , чем find -iregex
и примерно в 13 раз быстрее, чем find -iname
. Кстати, оба инструмента нашли одинаковые 546 файлов?
Примечание : это один конкретный эталон на одной конкретной машине. Хотя мы выполнили множество различных тестов (и нашли последовательные результаты), для вас все может отличаться! Мы призываем всех попробовать это самостоятельно. Смотрите этот репозиторий для всех необходимых сценариев.
Что касается скорости FD , большая часть заслуги идет в regex
и ignore
ящики, которые также используются в Ripgrep (проверьте это!).
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
или функций оболочки alias
оболочки и функции оболочки не могут использоваться для выполнения команды через fd -x
или fd -X
. В zsh
вы можете сделать псевдоним глобальным через alias -g myalias="…"
. В bash
вы можете использовать export -f my_function
, чтобы сделать доступным для детей. Вам все равно нужно позвонить fd -x bash -c 'my_function "$1"' bash
. Для других вариантов использования или оболочек используйте (временный) сценарий оболочки.
fzf
Вы можете использовать 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 '
Вы даже можете использовать цветный выход FD внутри FZF, установив:
export FZF_DEFAULT_COMMAND= " fd --type file --color=always "
export FZF_DEFAULT_OPTS= " --ansi "
Для получения более подробной информации см. Раздел «Советы» FZF Readme.
rofi
Rofi - это приложение для запуска графического запуска, которое способно создавать меню, читая из Stdin . Вывод fd
в режим rofi
S -dmenu
создает нечеткие списки файлов и каталогов.
Создайте нечувствительный к случаю, доступный для поиска многопользовательского списка PDF- файлов в вашем каталоге $HOME
и откройте выбор с помощью вашего настроенного просмотра 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
Пакет EMACS FILE-FILE-In-PROCTE может использовать FD для поиска файлов.
После установки find-file-in-project
добавьте линию (setq ffip-use-rust-fd t)
в ваш файл ~/.emacs
или ~/.emacs.d/init.el
.
В Emacs запустите Mx find-file-in-project-by-selected
чтобы найти соответствующие файлы. В качестве альтернативы, запустите Mx find-file-in-project
чтобы перечислить все доступные файлы в проекте.
Для форматирования вывода fd
в качестве файлового дерева вы можете использовать команду tree
с помощью --fromfile
:
❯ fd | tree --fromfile
Это может быть более полезным, чем запуск tree
сама по себе, потому что tree
не игнорирует никаких файлов по умолчанию, и при этом оно не поддерживает набор параметров, как и fd
, чтобы управлять тем, что печатать:
❯ fd --extension rs | tree --fromfile
.
├── build.rs
└── src
├── app.rs
└── error.rs
На Bash и подобном вы можете просто создать псевдоним:
❯ alias as-tree= ' tree --fromfile '
xargs
или parallel
Обратите внимание, что fd
имеет встроенную функцию для выполнения команды с ее параметрами -x
/ --exec
и -X
/ --exec-batch
. Если вы предпочитаете, вы все равно можете использовать его в сочетании с xargs
:
> fd -0 -e rs | xargs -0 wc -l
Здесь опция -0
подсказывает FD разделить результаты поиска от нулевого символа (вместо новичков). Точно так же, опция -0
вариант xargs
говорит ему прочитать вход таким образом.
... и другие дистрибутивы Linux на основе Debian.
Если вы запускаете Ubuntu 19.04 (Disco Dingo) или более новее, вы можете установить официально поддерживаемый пакет:
apt install fd-find
Обратите внимание, что двоичный файл называется fdfind
поскольку двоичное имя fd
уже используется другим пакетом. Рекомендуется, чтобы после установки вы добавляли ссылку на fd
, выполнив команду 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
Обратите внимание, что двоичный файл называется fdfind
поскольку двоичное имя fd
уже используется другим пакетом. Рекомендуется, чтобы после установки вы добавляли ссылку на fd
, выполнив команду 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
Вы также можете установить FD из AUR.
Вы можете использовать FD Ebuild из официального репо:
emerge -av fd
Вы можете установить пакет FD из официального репо:
zypper in fd
Вы можете установить fd
через XBPS-Install:
xbps-install -S fd
Вы можете установить пакет FD из официального репо:
apt-get install fd
Вы можете установить пакет FD из официального репо:
eopkg install fd
Вы можете установить пакет fd
из Fedora Copr.
dnf copr enable tkbcopr/fd
dnf install fd
Другая версия с использованием более медленного Malloc вместо Jemalloc также доступна в Repo Epel8/9 в качестве пакета fd-find
.
Вы можете установить fd
с Homebrew:
brew install fd
… Или с Macports:
port install fd
Вы можете скачать предварительно построенные двоичные файлы со страницы выпуска.
В качестве альтернативы, вы можете установить fd
через Scoop:
scoop install fd
Или через шоколадный:
choco install fd
Или через Вингет:
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's Manager вы можете установить FD через:
cargo install fd-find
Обратите внимание, что версия ржавчины 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.
См. Файлы лицензии-апоша и лицензии MIT для получения информации о лицензии.