path - манипулирование и проверка путей
Synopsis
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]
Description
path выполняет операции над путями.
Аргументы 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 возвращает последнюю компоненту пути, удаляя префикс каталога и отступы слеша. Другими словами, это часть, которая не является директорией. Для файлов её можно назвать «именем файла».
Возвращает 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.6/cmds/path.html