path - манипулирование и проверка путей
Синтаксис
path basename GENERAL_OPTIONS [PATH ...]
path dirname GENERAL_OPTIONS [PATH ...]
path extension GENERAL_OPTIONS [PATH ...]
path filter GENERAL_OPTIONS [-v | --invert]
[-d] [-f] [-l] [-r] [-w] [-x] \
[(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]
path is GENERAL_OPTIONS [(-v | --invert)] [(-t | --type) TYPE]
[-d] [-f] [-l] [-r] [-w] [-x]
[(-p | --perm) PERMISSION] [PATH ...]
path normalize GENERAL_OPTIONS [PATH ...]
path resolve GENERAL_OPTIONS [PATH ...]
path change-extension GENERAL_OPTIONS EXTENSION [PATH ...]
path sort GENERAL_OPTIONS [-r | --reverse]
[-u | --unique] [--key=basename|dirname|path] [PATH ...]
GENERAL_OPTIONS := [-z | --null-in] [-Z | --null-out] [-q | --quiet]
Описание
path выполняет операции с путями.
Аргументы PATH берутся из командной строки, если стандартный ввод не подключен к пайпу или файлу, в противном случае они считываются со стандартного ввода, по одному пути на строке. Недопустимо передавать аргументы PATH как в командной строке, так и в стандартном вводе.
Аргументы, начинающиеся с -, обычно интерпретируются как переключатели; -- указывает, что следующие аргументы не должны интерпретироваться как переключатели, даже если они начинаются с -. Переключатели и обязательные аргументы распознаются только в командной строке.
Когда путь начинается с -, path filter и path normalize будут добавлять префикс ./ к выводу, чтобы избежать его интерпретации как опции в ином случае, поэтому безопасно передавать вывод пути другим командам, которые могут обрабатывать относительные пути.
Все подкоманды принимают переключатель -q или --quiet, который подавляет обычный вывод, но завершается с указанным статусом. В этом случае эти команды завершатся раньше, не прочитав весь доступный ввод.
Все подкоманды также принимают переключатель -Z или --null-out, который заставляет их выводить данные, разделенные символом NULL вместо символов новой строки. Это предназначено для дальнейшей обработки, например, передачи в другую команду path, или xargs -0. Это не рекомендуется, когда вывод направляется в терминал или в подстановку команды.
Все подкоманды также принимают переключатель -z или --null-in, который заставляет их принимать аргументы из стандартного ввода, разделённые символами NULL. Поскольку пути Unix не могут содержать символ NULL, это позволяет обработать все возможные пути и считать данные из, например, find -print0. Если аргументы заданы в командной строке, это не имеет эффекта. Это в основном не нужно, так как path автоматически начинает разделять на NULL, если он появляется в первых PATH_MAX байтах, где PATH_MAX - максимальная длина пути операционной системы плюс один байт для NULL.
Некоторые подкоманды работают с путями как со строками и поэтому работают с несуществующими путями, в то время как другие должны обращаться к самим путям и поэтому отфильтровывают несуществующие пути.
Доступны следующие подкоманды.
“basename” подкоманда
path basename [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]
path basename возвращает последнюю компоненту пути, удаляя префикс каталога и отступы слева и справа. Другими словами, это та часть, которая не является dirname. Для файлов вы можете назвать это «именем файла».
Возвращает 0, если basename существовал, т.е. если путь не был пустым или состоял только из слешей.
Примеры
>_ path basename ./foo.mp4 foo.mp4 >_ path basename ../banana banana >_ path basename /usr/bin/ bin >_ path basename /usr/bin/* # This prints all files in /usr/bin/ # A selection: cp fish grep rm
“dirname” подкоманда
path dirname [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]
path dirname возвращает dirname для данного пути. Это часть перед последним «/», без учета отступов слева и справа. Другими словами, это та часть, которая не является basename (без учета избыточных слешей).
Возвращает 0, если dirname существовал, т.е. если путь не был пустым или состоял только из слешей.
Примеры
>_ path dirname ./foo.mp4 . >_ path dirname ../banana .. >_ path dirname /usr/bin/ /usr
“extension” подкоманда
path extension [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]
path extension возвращает расширение данного пути. Это часть после (и включая) последней «.», если эта «.» не следует за «/» или basename не «.» или «..», в этом случае расширения нет и выводится пустая строка.
Если имя файла заканчивается на «.», выводится только «.».
Возвращает 0, если расширение существовало.
Примеры
>_ path extension ./foo.mp4 .mp4 >_ path extension ../banana # an empty line, status 1 >_ path extension ~/.config # an empty line, status 1 >_ path extension ~/.config.d .d >_ path extension ~/.config. . >_ set -l path (path change-extension '' ./foo.mp4) >_ set -l extension (path extension ./foo.mp4) > echo $path$extension # reconstructs the original path again. ./foo.mp4
“filter” подкоманда
path filter [-z | --null-in] [-Z | --null-out] [-q | --quiet] \
[-d] [-f] [-l] [-r] [-w] [-x] \
[-v | --invert] [(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]
path filter возвращает все заданные пути, которые соответствуют заданным условиям. Во всех случаях пути должны существовать, несуществующие пути всегда отфильтровываются.
Доступные фильтры:
-
-tили--typeс опциями: «dir», «file», «link», «block», «char», «fifo» и «socket», в этом случае путь должен быть каталогом, файлом, ссылкой, блочным устройством, символьным устройством, именованной пайпой или сокетом соответственно. -
-d,-fи-l— сокращения для--type=dir,--type=fileи--type=linkсоответственно. Для других типов нет сокращений. -
-pили--permс опциями: «read», «write» и «exec», а также «suid», «sgid», «user» (ссылаясь на владельца пути) и «group» (ссылаясь на группу пути), в этом случае путь должен иметь все указанные разрешения для текущего пользователя. -
-r,-wи-x— сокращения для--perm=read,--perm=writeи--perm=execсоответственно. Для других разрешений нет сокращений.
Обратите внимание, что путь должен быть любого из указанных типов, но иметь все указанные разрешения. Это связано с тем, что наличие пути, который одновременно является доступным для записи и для выполнения, имеет смысл, но наличие пути, который одновременно является каталогом и файлом, не имеет смысла. Ссылки будут учитываться как тип файла, на который указывает ссылка, поэтому ссылки на файлы учитываются как файлы, ссылки на каталоги учитываются как каталоги.
Опции фильтра можно задавать либо как несколько опций, либо через запятую - path filter -t dir,file или path filter --type dir --type file эквивалентны.
С --invert, смысл фильтрации инвертируется — любой путь, который бы не прошел (включая не существующий), проходит, а любой путь, который бы прошел, не проходит.
Когда путь начинается с -, path filter добавит префикс ./ , чтобы избежать его интерпретации как опции в ином случае.
Возвращает 0, если хотя бы один путь прошел фильтрацию.
path is является сокращением для path filter -q, т.е. только проверки без вывода, см. Подкоманду is.
Примеры
>_ path filter /usr/bin /usr/argagagji # The (hopefully) nonexistent argagagji is filtered implicitly: /usr/bin >_ path filter --type file /usr/bin /usr/bin/fish # Only fish is a file /usr/bin/fish >_ path filter --type file,dir --perm exec,write /usr/bin/fish /home/me # fish is a file, which passes, and executable, which passes, # but probably not writable, which fails. # # $HOME is a directory and both writable and executable, typically. # So it passes. /home/me >_ path filter -fdxw /usr/bin/fish /home/me # This is the same as above: "-f" is "--type=file", "-d" is "--type=dir", # "-x" is short for "--perm=exec" and "-w" short for "--perm=write"! /home/me >_ path filter -fx $PATH/* # Prints all possible commands - the first entry of each name is what fish would execute!
“is” подкоманда
path is [-z | --null-in] [-Z | --null-out] [-q | --quiet] \
[-d] [-f] [-l] [-r] [-w] [-x] \
[-v | --invert] [(-t | --type) TYPE] [(-p | --perm) PERMISSION] [PATH ...]
path is — сокращение для path filter -q. Возвращает true, если любой из заданных файлов проходит фильтрацию, но не выводит ничего.
--quiet всё ещё может передаваться для совместимости, но является избыточным. Опции такие же, как у path filter.
Примеры
>_ path is /usr/bin /usr/argagagji # /usr/bin exists, so this returns a status of 0 (true). It prints nothing. >_ path is /usr/argagagji # /usr/argagagji does not, so this returns a status of 1 (false). It also prints nothing. >_ path is -fx /bin/sh # /bin/sh is usually an executable file, so this returns true.
“normalize” подкоманда
path normalize [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]
path normalize возвращает нормализованные версии всех путей. Это означает, что он убирает дублирующиеся «/» (кроме двух ведущих «//»), сворачивает «../» с предыдущими компонентами и удаляет компоненты «.».
В отличие от realpath или path resolve, он не делает пути абсолютными. Он также не разрешает ссылки. Таким образом, он может работать с несуществующими путями.
Ведущие «./» компоненты обычно удаляются. Но когда путь начинается с -, path normalize добавит его вместо этого, чтобы избежать путаницы с опциями.
Возвращает 0, если была произведена какая-либо нормализация, т.е. какой-либо заданный путь не был в канонической форме.
Примеры
>_ path normalize /usr/bin//../../etc/fish # The "//" is squashed and the ".." components neutralize the components before /etc/fish >_ path normalize /bin//bash # The "//" is squashed, but /bin isn't resolved even if your system links it to /usr/bin. /bin/bash >_ path normalize ./my/subdirs/../sub2 my/sub2 >_ path normalize -- -/foo ./-/foo
“resolve” подкоманда
path resolve [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]
path resolve возвращает нормализованные, физические и абсолютные версии всех путей. Это означает, что он разрешает ссылки, и делает то же, что и path normalize: убирает дублирующиеся «/» (кроме двух ведущих «//»), сворачивает «../» с предыдущими компонентами и удаляет компоненты «.» . Затем он преобразует этот путь в абсолютный путь, начиная с корня файловой системы «/».
Он похож на realpath, так как создаёт «реальную», каноническую версию пути. Однако для путей, которые не могут быть разрешены, например, если они не существуют или образуют цикл ссылок, он будет разрешать их по мере возможности и нормализовывать остальную часть.
Возвращает 0, если была произведена какая-либо нормализация или разрешение, т.е. какой-либо заданный путь не был в канонической форме.
Примеры
>_ path resolve /bin//sh # The "//" is squashed, and /bin is resolved if your system links it to /usr/bin. # sh here is bash (this is common on linux systems) /usr/bin/bash >_ path resolve /bin/foo///bar/../baz # Assuming /bin exists and is a symlink to /usr/bin, but /bin/foo doesn't. # This resolves the /bin/ and normalizes the nonexistent rest: /usr/bin/foo/baz
“change-extension” подкоманда
path change-extension [-z | --null-in] [-Z | --null-out] \
[-q | --quiet] EXTENSION [PATH ...]
path change-extension возвращает заданные пути с изменённым расширением на указанное новое расширение. Расширение — это часть после (и включая) последней «.», если эта «.» не следует за «/» или basename не «.» или «..», в этом случае предыдущего расширения нет, и новое просто добавляется.
Если расширение пустое, любое предыдущее расширение удаляется вместе с «.» Это, конечно, обратное path extension.
Один ведущий знак «.» в расширении игнорируется, поэтому «.mp3» и «mp3» обрабатываются одинаково.
Возвращает 0, если были заданы какие-либо пути.
Примеры
>_ path change-extension mp4 ./foo.wmv ./foo.mp4 >_ path change-extension .mp4 ./foo.wmv ./foo.mp4 >_ path change-extension '' ../banana ../banana # but status 1, because there was no extension. >_ path change-extension '' ~/.config /home/alfa/.config # status 1 >_ path change-extension '' ~/.config.d /home/alfa/.config # status 0 >_ path change-extension '' ~/.config. /home/alfa/.config # status 0
“sort” подкоманда
path sort [-z | --null-in] [-Z | --null-out] \
[-q | --quiet] [-r | --reverse] \
[--key=basename|dirname|path] [PATH ...]
path sort возвращает заданные пути в отсортированном порядке. Они сортируются в том же порядке, что и шаблоны — по алфавиту, но с последовательностями цифровых символов сравниваются по числовому значению.
С --reverse или -r сортировка инвертируется.
С --key= сравнивается только заданный путь, например, --key=dirname заставляет сравнивать только dirname, --key=basename только basename и --key=path заставляет сравнивать весь путь (это значение по умолчанию).
С --unique или -u сортировка дедублицируется, то есть сохраняется только первый из последовательности элементов с одинаковым ключом. Таким образом, если вы сортируете по basename, то используется только первый basename для каждого.
Используемая сортировка стабильна, поэтому сначала сортировка по basename, а затем по dirname работает и группирует файлы по каталогам.
В настоящее время возвращает 0, если были заданы какие-либо пути.
Примеры
>_ path sort 10-foo 2-bar 2-bar 10-foo >_ path sort --invert 10-foo 2-bar 10-foo 2-bar >_ path sort --unique --key=basename $fish_function_path/*.fish # prints a list of all function files fish would use, sorted by name.
Комбинирование path
path предназначен для простоты сочетания с самим собой, другими инструментами и fish.
Вот почему
-
Вывод
pathавтоматически разделяется fish, если он попадает в подстановку команды, поэтому просто(path ...)правильно обрабатывает все пути, даже содержащие символы новой строки -
pathимеет--null-inдля обработки входных данных, разделенных нулями (обычно автоматически обнаруживается!), и--null-outдля передачи выходных данных, разделенных нулями
Некоторые примеры объединения path:
# Expand all paths in the current directory, leave only executable files, and print their resolved path path filter -zZ -xf -- * | path resolve -z # The same thing, but using find (note -maxdepth needs to come first or find will scream) # (this also depends on your particular version of find) # Note the `-z` is unnecessary for any sensible version of find - if `path` sees a NULL, # it will split on NULL automatically. find . -maxdepth 1 -type f -executable -print0 | path resolve -z set -l paths (path filter -p exec $PATH/fish -Z | path resolve)
© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.5/cmds/path.html