Файлы без расширения линукс

How can I remove the extension of a filename in a shell script?

in a shell gives me the output I want, test . I already know $filename has been assigned the right value. What I want to do is assign to a variable the filename without the extension.

basename $filename .exe would do the same thing. That’s assuming you always know what extension you want to remove.

16 Answers 16

You can also use parameter expansion:

$ filename=foo.txt $ echo "$" foo 

If you have a filepath and not just a filename, you’ll want to use basename first to get just the filename including the extension. Otherwise, if there’s a dot only in the path (e.g. path.to/myfile or ./myfile ), then it will trim inside the path; even if there isn’t a dot in the path, it will get the (e.g. path/to/myfile if the path is path/to/myfile.txt ):

$ filepath=path.to/foo.txt $ echo "$" path.to/foo $ filename=$(basename $filepath) $ echo $filename foo.txt $ echo "$" foo 

Just be aware that if the filename only starts with a dot (e.g. .bashrc ) it will remove the whole filename.

And here I was about to use echo -n «This.File.Has.Periods.In.It.txt» | awk -F. » | tr ‘ ‘ ‘.’ | rev | cut -c 2- | rev . Thanks.

Be warned this deletes the entire name if there is no extension and the path is relative. E.g., filename=./ihavenoextension .

If you know the extension, you can use basename

$ basename /home/jsmith/base.wiki .wiki base 

@GabrielStaples you could combine it with dirname , e.g. file=/home/jsmith/base.wiki; echo $(dirname $file)/$(basename $file .wiki)

I went with this. The nice thing is that basename is made for this and I discovered a new capability in what it can do.

You should be using the command substitution syntax $(command) when you want to execute a command in script/command.

name=$(echo "$filename" | cut -f 1 -d '.') 
  1. echo get the value of the variable $filename and send it to standard output
  2. We then grab the output and pipe it to the cut command
  3. The cut will use the . as delimiter (also known as separator) for cutting the string into segments and by -f we select which segment we want to have in output
  4. Then the $() command substitution will get the output and return its value
  5. The returned value will be assigned to the variable named name

Note that this gives the portion of the variable up to the first period . :

$ filename=hello.world $ echo "$filename" | cut -f 1 -d '.' hello $ filename=hello.hello.hello $ echo "$filename" | cut -f 1 -d '.' hello $ filename=hello $ echo "$filename" | cut -f 1 -d '.' hello 

The problem with this answer is it assumes input string has ONLY one dot . @chepner below has a much better solution . name=$

Читайте также:  Linux стереть содержимое файла

This answer is characteristic of beginners and should not be spreaded. Use the builtin mechanism as described by chepner’s answer

If your filename contains a dot (other than the one of the extension) then use this:

echo $filename | rev | cut -f 2- -d '.' | rev 

It’s even better with an -s option given to cut , so that it returns an empty string whenever the filename contains no dot.

This should be the accepted answer in my opinion, since it works on path with dots in them, with hidden files starting with a dot, or even with file with multiple extensions.

Using POSIX’s built-in only:

#!/usr/bin/env sh path=this.path/with.dots/in.path.name/filename.tar.gz # Get the basedir without external command # by stripping out shortest trailing match of / followed by anything dirname=$ # Get the basename without external command # by stripping out longest leading match of anything followed by / basename=$ # Strip uptmost trailing extension only # by stripping out shortest trailing match of dot followed by anything oneextless=$; echo "$oneextless" # Strip all extensions # by stripping out longest trailing match of dot followed by anything noext=$; echo "$noext" # Printout demo printf %s\\n "$path" "$dirname" "$basename" "$oneextless" "$noext" 
this.path/with.dots/in.path.name/filename.tar.gz this.path/with.dots/in.path.name filename.tar.gz filename.tar filename 

For a path like /home/user/.profile the $oneextless and $noext variables become empty strings; in other words the «dot-file» name vanishes.

file1=/tmp/main.one.two.sh t=$(basename "$file1") # output is main.one.two.sh name=$(echo "$file1" | sed -e 's/\.[^.]*$//') # output is /tmp/main.one.two name=$(echo "$t" | sed -e 's/\.[^.]*$//') # output is main.one.two 

use whichever you want. Here I assume that last . (dot) followed by text is extension.

What happens when file1=/tmp.d/mainonetwosh ? The sed expression should be replaced with ‘s/\.[^./]*$//’

#!/bin/bash file=/tmp/foo.bar.gz echo $file $

Note that only the last extension is removed.

It’s simple, clean and it can be chained to remove more than one extension:

And it can be combined with other similar modifiers.

#!/bin/bash filename=program.c name=$(basename "$filename" .c) echo "$name" 

@gniourf_gniourf upvoting because you’ve made it a useful answer by showing how to correctly use it with a variable.

My recommendation is to use basename .
It is by default in Ubuntu, visually simple code and deal with majority of cases.

Here are some sub-cases to deal with spaces and multi-dot/sub-extension:

pathfile="../space fld/space -file.tar.gz" echo $ 

It usually get rid of extension from first . , but fail in our .. path

echo **"$(basename "$")"** space -file.tar # I believe we needed exatly that 

Here is an important note:

I used double quotes inside double quotes to deal with spaces. Single quote will not pass due to texting the $. Bash is unusual and reads «second «first» quotes» due to expansion.

However, you still need to think of .hidden_files

hidden="~/.bashrc" echo "$(basename "$")" # will produce "~" . 

not the expected «» outcome. To make it happen use $HOME or /home/user_path/
because again bash is «unusual» and don’t expand «~» (search for bash BashPitfalls)

hidden2="$HOME/.bashrc" ; echo '$(basename "$")' 

Answers provided previously have problems with paths containing dots. Some examples:

/xyz.dir/file.ext ./file.ext /a.b.c/x.ddd.txt 

I prefer to use |sed -e ‘s/\.[^./]*$//’ . For example:

$ echo "/xyz.dir/file.ext" | sed -e 's/\.[^./]*$//' /xyz.dir/file $ echo "./file.ext" | sed -e 's/\.[^./]*$//' ./file $ echo "/a.b.c/x.ddd.txt" | sed -e 's/\.[^./]*$//' /a.b.c/x.ddd 

Note: If you want to remove multiple extensions (as in the last example), use |sed -e ‘s/\.[^/]*$//’ :

$ echo "/a.b.c/x.ddd.txt" | sed -e 's/\.[^/]*$//' /a.b.c/x 

However, this method will fail in «dot-files» with no extension:

$ echo "/a.b.c/.profile" | sed -e 's/\.[^./]*$//' /a.b.c/ 

To cover also such cases, you can use:

$ echo "/a.b.c/.profile" | sed -re 's/(^.*[^/])\.[^./]*$/\1/' /a.b.c/.profile 

This one covers all possibilities! (dot in the path or not; with extension or no extension):

Читайте также:  Define environment variable linux

tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $);echo $filename_noextension

  • It gives you the filename without any extension. So there is no path in the $filename_noextension variable.
  • You end up with two unwanted variables $tmp1 and $tmp2 . Make sure you are not using them in your script.

filename=.bashrc; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=.bashrc.txt; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=.bashrc.txt.tar; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=~/.bashrc; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=~/.bashrc.txt.tar; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=bashrc; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=bashrc.txt; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=bashrc.txt.tar; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=~/bashrc; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

filename=~/bashrc.txt.tar; echo «filename: $filename»; tmp1=$;tmp2=$;filename_noextension=$(echo -n $;echo $); echo «filename without extension: $filename_noextension»

Источник

Запуск скрипта без расширения sh

Название у файла с расширением? Здесь тут не виндовс. А в чём проблема табуляцию нажать?

Хорошо, вам виндузятникам, я даже вопрос не понял. Надо же он файл без суффикса запускать пытался!

mv /usr/bin/script.sh /usr/bin/script

Psych218 ★★★★★ ( 23.06.15 13:56:03 MSK )
Последнее исправление: Psych218 23.06.15 13:56:19 MSK (всего исправлений: 1)

Это же ламер так и напишет «script»

geekq@opensuse_laptop:~> cat >> script #!/bin/bash echo "hello" geekq@opensuse_laptop:~> cat script #!/bin/bash echo "hello" geekq@opensuse_laptop:~> chmod +x script geekq@opensuse_laptop:~> ./script hello geekq@opensuse_laptop:~> 

Это же ламер так и напишет «script»

Действительно. Я понадеяся на то, что тут script для примера, и на самом деле там внятное имя.

mv /usr/bin/script.sh /usr/local/bin/myscriptname

Ну и запускать по myscriptname , которое можно задать любое. Ну или если прям очень хочется, чтобы по script , запускался этот скрипт, то положить его как /usr/local/bin/script, и убедиться, что в $PATH /usr/local/bin раньше, чем /usr/bin.

Читайте также:  Dayz standalone server linux

А в /usr скриптами не из пакетного менеджера срать не надо. Для этого есть специальное место — /usr/local.

Psych218 ★★★★★ ( 23.06.15 14:24:42 MSK )
Последнее исправление: Psych218 23.06.15 14:25:46 MSK (всего исправлений: 1)

Источник

Как запустить файл без расширения

Исполняемый файл среды разработки Processing IDE не имеет расширения. В Windows он (файл) запускается по клику, а в Ubuntu этот файл по клику открывается в текстовом редакторе.
Processing IDE не требует установки.

Как запустить программу по имени (без пути и расширения) из ComboBox`a
Как сделать так, чтобы выполнялось следующее: Есть 4 файла с расширением .bat: 1.bat 2.bat.

Как скопировать файл без расширения
ребят есть папка в которой файл без расширения нужно этот файл както скопировать примеру в др папку.

Как скопировать файл, зная только его имя без расширения?
Нужно скопировать файл,зная только его название,но не зная расширения.

Эксперт NIX

Линуксу похрен на расширения. Он анализирует внутреннюю структуру файлов. Чтобы файл выполнялся ему надо присвоить атрибут исполнения. Например через консоль так

ЦитатаСообщение от dserp18 Посмотреть сообщение

В Windows он (файл) запускается по клику, а в Ubuntu этот файл по клику открывается в текстовом редакторе.

Ещё — в линуксе программы запускаются не по клику, а по имени в терминале. Что делать с кликаемыми файлами — вообще говоря, решает программа, в которой кликают. Открывать текстовый файл в редакторе — логичный вариант. Для исполнения по клику используются файлы .desktop, похожие на ярлыки.
https://wiki.archlinux.org/ind. op_entries

Эксперт по компьютерным сетямЭксперт NIX

ЦитатаСообщение от dserp18 Посмотреть сообщение

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

ЦитатаСообщение от Marinero Посмотреть сообщение

Источник

Оцените статью
Adblock
detector