Как удалить суффикс файла и часть пути из строки пути в Bash?
У меня есть строка с путем к файлу, например, /foo/fizzbuzz.bar
. Как я могу с помощью bash извлечь только часть fizzbuzz
из этой строки?
5 ответ(ов)
Команда basename
используется для получения имени файла из полного пути. В приведенном вами примере:
NAME="$(basename /foo/fizzbuzz.bar .bar)"
команда basename
получает в качестве первого аргумента полный путь к файлу /foo/fizzbuzz.bar
, а в качестве второго аргумента - суффикс .bar
, который необходимо удалить. В результате выполнения этой команды переменная NAME
будет содержать значение fizzbuzz
, так как .bar
была успешно удалена.
Таким образом, если у вас есть путь к файлу, и вы хотите извлечь его имя без определенного суффикса, используйте basename
в таком формате.
Вы можете использовать следующий код для получения имени файла без расширения, даже если в имени файла содержатся точки:
for file in *; do
ext=${file##*.}
fname=`basename $file $ext`
# Ваши действия с $fname
done
Этот подход не требует предварительного знания расширения файла и корректно работает с именами файлов, содержащими точки перед расширением. Однако учтите, что в данном варианте используется программа basename
, которая является частью GNU coreutils и, как правило, присутствует в большинстве дистрибутивов.
Вам нужно выполнить две операции с помощью чистого bash:
Удалить путь из строки пути:
path=/foo/bar/bim/baz/file.gif file=${path##*/} # Теперь \$file содержит 'file.gif'
Удалить расширение из строки пути:
base=${file%.*} # Теперь \${base} содержит 'file'.
Таким образом, в результате выполнения этих операций вы получите название файла без пути и без расширения. Если у вас будут дополнительные вопросы, не стесняйтесь их задавать!
Функции basename
и dirname
— это то, что вам нужно:
mystring=/foo/fizzbuzz.bar
echo basename: $(basename "${mystring}")
echo basename + remove .bar: $(basename "${mystring}" .bar)
echo dirname: $(dirname "${mystring}")
Вывод будет следующим:
basename: fizzbuzz.bar
basename + remove .bar: fizzbuzz
dirname: /foo
Таким образом, basename
возвращает имя файла с полным путем, а dirname
возвращает путь к директории. Если нужно удалить специфическое расширение файла, можно передать его вторым аргументом функции basename
, как показано выше.
В Pure bash варианте для извлечения имени файла без расширения и пути можно использовать следующий код:
x="/foo/bar/fizzbuzz.bar.quux.zoom"
y=${x/\/*\//}
echo ${y/.*/}
Этот код извлекает имя файла fizzbuzz
из полного пути. Здесь используются конструкции расширения параметров, описанные в man bash в разделе "Parameter Expansion".
Обратите внимание, что данный метод работает с точками в суффиксах файлов (например, .bar
, .quux
, .zoom
) и не требует знания конкретного расширения. Однако стоит отметить, что такой подход не сработает, если в самом имени файла есть точки (например, если файл называется fizzbuzz.bar
).
Если вам нужно решить задачу с учетом точек в самом названии файла, возможно, стоит рассмотреть другие инструменты, такие как awk, perl или sed.
Извлечение имени файла и расширения в Bash
Извлечение подстроки в Bash
Как перебрать файлы в директории, изменить путь и добавить суффикс к имени файла
Многострочная строка с дополнительными пробелами (сохраняем отступы)
Как вернуть строковое значение из функции Bash