5

Как удалить суффикс файла и часть пути из строки пути в Bash?

17

У меня есть строка с путем к файлу, например, /foo/fizzbuzz.bar. Как я могу с помощью bash извлечь только часть fizzbuzz из этой строки?

5 ответ(ов)

3

Команда basename используется для получения имени файла из полного пути. В приведенном вами примере:

NAME="$(basename /foo/fizzbuzz.bar .bar)"

команда basename получает в качестве первого аргумента полный путь к файлу /foo/fizzbuzz.bar, а в качестве второго аргумента - суффикс .bar, который необходимо удалить. В результате выполнения этой команды переменная NAME будет содержать значение fizzbuzz, так как .bar была успешно удалена.

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

0

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

for file in *; do
    ext=${file##*.}
    fname=`basename $file $ext`

    # Ваши действия с $fname
done

Этот подход не требует предварительного знания расширения файла и корректно работает с именами файлов, содержащими точки перед расширением. Однако учтите, что в данном варианте используется программа basename, которая является частью GNU coreutils и, как правило, присутствует в большинстве дистрибутивов.

0

Вам нужно выполнить две операции с помощью чистого bash:

  1. Удалить путь из строки пути:

    path=/foo/bar/bim/baz/file.gif
    
    file=${path##*/}  
    # Теперь \$file содержит 'file.gif'
    
  2. Удалить расширение из строки пути:

    base=${file%.*}
    # Теперь \${base} содержит 'file'.
    

Таким образом, в результате выполнения этих операций вы получите название файла без пути и без расширения. Если у вас будут дополнительные вопросы, не стесняйтесь их задавать!

0

Функции 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, как показано выше.

0

В 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.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь