Spec-Zone.ru › Fish 3.7

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 mtime GENERAL_OPTIONS [(-R | --relative)] [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 как в командной строке, так и в стандартном вводе.

Аргументы, начинающиеся с -, обычно интерпретируются как переключатели; -- приводит к тому, что следующие аргументы не обрабатываются как переключатели, даже если они начинаются с -. Переключатели и необходимые аргументы распознаются только в командной строке.

Когда путь начинается с -, path filter и path normalize будут добавлять ./ в выходные данные, чтобы избежать его интерпретации как опции, поэтому безопасно передавать выходные данные пути другим командам, которые могут обрабатывать относительные пути.

Все подкоманды принимают переключатель -q или --quiet, который подавляет обычный вывод, но завершает работу с документированным статусом. В этом случае эти команды завершатся рано, не прочитав весь доступный ввод.

Все подкоманды также принимают переключатель -Z или --null-out, который заставляет их печатать выходные данные, разделенные символом NUL вместо новых строк. Это предназначено для дальнейшей обработки, например, передачи в другую команду 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.

Подкоманда “mtime”

path mtime [-z | --null-in] [-Z | --null-out] [-q | --quiet] [-R | --relative] [PATH ...]

path mtime возвращает время последней модификации («mtime» на языке Unix) заданных путей в секундах с момента эпохи Unix (начало 1 января 1970 года).

С --relative (или -R), она выводит количество секунд с момента последней модификации. Она считывает текущее время только один раз в начале, поэтому во всех случаях, когда задано несколько путей, времена относительны к началу выполнения path mtime -R.

Если вам нужно узнать, является ли файл более новым или более старым, чем другой файл, используйте test -nt вместо этого. См. документацию по test.

Возвращает 0, если чтение mtime для любого пути прошло успешно.

Примеры

>_ date +%s
# This prints the current time as seconds since the epoch
1657217847

>_ path mtime /etc/
1657213796

>_ path mtime -R /etc/
4078
# So /etc/ on this system was last modified a little over an hour ago

# This is the same as
>_ math (date +%s) - (path mtime /etc/)

Подкоманда “normalize”

path normalize [-z | --null-in] [-Z | --null-out] [-q | --quiet] [PATH ...]

path normalize возвращает нормализованные версии всех путей. Это означает, что она объединяет повторяющиеся «/» (кроме двух ведущих «//»), сворачивает «../» с предыдущими компонентами и удаляет компоненты «.».

В отличие от realpath или path resolve, она не делает пути абсолютными. Она также не разрешает символьные ссылки. Таким образом, она может работать с несуществующими путями.

Поскольку она работает с путями как со строками и не разрешает символьные ссылки, она работает примерно как pwd -L и cd. Например, path normalize link/.. вернёт ., точно так же, как cd link; cd .. вернёт в текущий каталог. Для физического представления файловой системы см. 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, так как создаёт «реальную», каноническую версию пути. Однако для путей, которые нельзя разрешить, например, если они не существуют или образуют цикл символьных ссылок, она разрешит их по возможности и нормализует остальную часть.

Поскольку она разрешает символьные ссылки, она работает примерно как pwd -P. Например, path resolve link/.. вернёт родительский каталог того, на что указывает ссылка, так же как cd link; cd (pwd -P)/.. перейдёт к нему. Для логического представления файловой системы см. path normalize.

Возвращает 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 возвращает заданные пути в отсортированном порядке. Они сортируются в том же порядке, что и у globs — лексикографически, но при этом серии числовых цифр сравниваются численно.

С помощью --reverse или -r сортировка выполняется в обратном порядке.

С помощью --key= сравнивается только указанная часть пути, например, --key=dirname приводит к сравнению только каталога, --key=basename — только имени файла, а --key=path — всего пути (это значение по умолчанию).

С помощью --unique или -u сортировка выполняется с удалением дубликатов, что означает, что из серии элементов с одинаковым ключом сохраняется только первый. Так, если сортировка выполняется по имени файла, то используется только первый элемент для каждого имени файла.

Используемая сортировка является устойчивой, поэтому сортировка сначала по имени файла, а затем по каталогу работает и группирует файлы в соответствии с каталогом.

В настоящее время она возвращает 0, если ей были переданы какие-либо пути.

Примеры

>_ path sort 10-foo 2-bar
2-bar
10-foo

>_ path sort --reverse 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)

© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.7/cmds/path.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API