Удаление расширения из файла, не зная его
Я знаю, как удалить расширение файла, когда я его знаю как:
nameis=$(basename $dataset .csv)
но я хочу удалить любое расширение, не зная об этом заранее, кто-нибудь знает, как это сделать?
Любая помощь ценится,
Тед
Ответы
Ответ 1
В bash вы можете сделать следующее:
nameis=${dataset%.*}
... например:
$ dataset=foo.txt
$ nameis=${dataset%.*}
$ echo $nameis
foo
Этот синтаксис описан на странице bash man:
${параметр% слово}
${параметр %% слово}
Удалить шаблон суффикса. Слово расширяется для создания шаблона так же, как при расширении пути. Если шаблон совпадает с завершающей частью расширенного значения параметра, то результатом расширения является расширенное значение параметра с кратчайшим шаблоном соответствия (случай "%" ) или самый длинный шаблон соответствия (случай "%%" ) удалены. Если параметр равен @или *, операция удаления паттерна применяется поочередно по каждому позиционному параметру, а расширение - это результирующий список. Если параметр представляет собой переменную массива с индексом @или *, операция удаления шаблона применяется поочередно к каждому члену массива, а расширение - результирующий список.
Ответ 2
Теперь, если вы хотите создать стильное старое школьное регулярное выражение:
echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/"
- > Возвращает: foo.bar.tar
I will break it down:
s/ Substitute
^ From the beginning
\( Mark
.* Everything (greedy way)
\) Stop Marking (the string marked goes to buffer 1)
\. until a "." (which will be the last dot, because of the greedy selection)
.* select everything (this is the extension that will be discarded)
$ until the end
/ With (substitute)
\1 The buffer 1 marked above (which is the filename before the last dot(.)
/ End
Криштиано Савино
Ответ 3
Может возникнуть что-то вроде ${dataset%.*}
; остерегайтесь файлов без расширений, хотя, поскольку он будет искать точку, которая не является частью расширения, чтобы отрубить.
Ответ 4
Вы можете удалить все после последней точки, если таковая имеется, с помощью sed
:
nameis=$(echo $filename | sed 's/\.[^.]*$//')
Но это не будет работать с файлами с двойными расширениями, такими как .tar.gz
.
Ответ 5
nameis = ${набор данных %%. *}
Предполагается, что ни один из ваших базовых имен не имеет точки. Это возвращает длинную до бесконечности строку слева.
Ответ 6
Я бы предложил вместо basename
использовать команду sed
для этого, например:
echo "$fileName" | sed 's/\..*$//g'