В любой оболочке POSIX (bash
, pdksh
, ksh93
, zsh
, dash
):
for name in *; do
printf '%s\n' "${name%%-*}"
done
Это выполнит все имена в текущем каталоге ивывести бит перед первым -
символом.Он делает это, удаляя строку с самым длинным суффиксом, совпадающую с -*
, из имени файла, используя стандартную подстановку параметров.
Обратите внимание, что -*
является шаблоном выделения оболочки, а не регулярным выражением.Регулярные выражения полезны для работы с текстом, но шаблоны глобализации бывают быстрыми и эффективными для работы с именами файлов и путями в целом, так как вам не нужно запускать другой процесс с механизмом регулярных выражений, например awk
или sed
.
В bash
вы также можете вообще избежать использования цикла:
set -- *
printf '%s\n' "${@%%-*}"
Это сначала устанавливает позиционные параметры для имен в текущем каталоге.printf
затем вызывается для набора имен, каждое из которых индивидуально преобразуется с той же подстановкой параметров, что и в первой части этого ответа.
То же самое, но с использованием переменной массива, отличной от массива позиционныхпараметры:
names=( * )
printf '%s\n' "${names[@]%%-*}"