Имя файла из пути, исключая (неизвестное) расширение

Все эти демоны используют WebKit (в основном для отображения подсказок входа в систему oauth2 ), а WebKit недавно представил gigacages для изоляции кучи, используемой их реализацией JS. Выделение для гигабайта достаточно велико, чтобы любой доступ к произвольному беззнаковому 32-битному смещению все равно попадал бы в гигабайт, что приводило к таким огромным выделениям. См. этот пост в блоге для получения более подробной информации о гигабайтах:https://labs.mwrinfosecurity.com/blog/some-brief-notes-on-webkit-heap-hardening/

0
10.02.2020, 14:53
3 ответа

Вы можете использовать модификаторы расширения параметров оболочки:

$ pathname="/home/paulo/paulo.pdf"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
paulo.pdf
$ basename=${filename%.*}
$ printf "%s\n" "$basename"
paulo

${pathname##*/}расширяется до содержимого pathnameза вычетом самого длинного префикса, соответствующего */, , то есть полный путь (, если он есть ). ${filename%.*}расширяется до содержимого filenameза вычетом кратчайшего суффикса, соответствующего .*, , то есть расширения файла (, если оно есть ).

Обратите внимание, что при этом удаляется только последний компонент имени файла, представленный точкой; поэтому paulo.tar.gzстанет paulo.tar, а не paulo. Строго говоря, расширение.gz(— это сжатый файл, который оказывается архивом; расширение .tarстановится действительно значимым только после извлечения файла ).

Это также не работает правильно для файлов с расширением -без точек -, , например..bashrcили .zshrc;basenameоказывается пустым. Для этого можно использовать значения по умолчанию :

.
$ pathname="/home/paulo/.zshrc"
$ filename=${pathname##*/}
$ printf "%s\n" "$filename"
.zshrc
$ basename=${filename%.*}
$ printf "%s\n" "$basename"

$ printf "%s\n" "${basename:-$filename}"
.zshrc
5
28.04.2021, 23:23

В оболочке zsh:

$ pathname=/home/paulo/paulo.pdf
$ printf '%s\n' $pathname:t:r
paulo
  • Модификатор :t("хвост" )извлекает последний компонент пути в$pathname(он работает какbasename).
  • Модификатор :r("корень", полагаю )извлекает бит имени файла до расширения, если оно есть. Расширение — это часть имени файла, которая стоит после последней точки. Это означает, что вы получите пустой результат для таких имен файлов, как .zshrc.

Другой связанный модификатор:

  • :h("голова" ), которая работает как dirname, и
  • :e("расширение" ), которое извлекает только расширение.
6
28.04.2021, 23:23

Это должно делать то, что вы хотите:

pathname="/home/paulo/paulo.pdf"
printf "%s\n" "$(basename $pathname)" | sed "s/\..*$//"
1
28.04.2021, 23:23

Теги

Похожие вопросы