Подтвердить что ты не робот

Удаление расширения из файла, не зная его

Я знаю, как удалить расширение файла, когда я его знаю как:

nameis=$(basename $dataset .csv)

но я хочу удалить любое расширение, не зная об этом заранее, кто-нибудь знает, как это сделать?

Любая помощь ценится, Тед

4b9b3361

Ответ 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'