Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File name without extension in bash for loop

Tags:

bash

In a for loop like this one:

for f in `ls *.avi`; do echo $f; ffmpeg -i $f $f.mp3; done 

$f will be the complete filename, including the extension. For example, for song1.avi the output of the command will be song1.avi.mp3. Is there a way to get only song1, without the .avi from the for loop?

I imagine there are ways to do that using awk or other such tools, but I'm hoping there's something more straight forward.

Thanks

like image 991
Bogdan Balan Avatar asked Aug 19 '11 08:08

Bogdan Balan


People also ask

How do I remove a filename extension in bash?

Remove File Extension Using the basename Command in Bash If you know the name of the extension, then you can use the basename command to remove the extension from the filename. The first command-Line argument of the basename command is the variable's name, and the extension name is the second argument.

How do I name a file without an extension?

GetFileNameWithoutExtension(ReadOnlySpan<Char>) Returns the file name without the extension of a file path that is represented by a read-only character span.

How do I get filenames without an extension in Linux?

If you want to retrieve the filename without extension, then you have to provide the file extension as SUFFIX with `basename` command. Here, the extension is “. txt”.


1 Answers

Use bash parameter expansion

${f%%.*} 

Note that you need the greedy version because there are multiple dots in the file name.

From bash manual:

${parameter%word}

${parameter%%word}

The word is expanded to produce a pattern just as in filename expansion. If the pattern matches a trailing portion of the expanded value of parameter, then the result of the expansion is the value of parameter with the shortest matching pattern (the ‘%’ case) or the longest matching pattern (the ‘%%’ case) deleted. If parameter is ‘@’ or ‘’, the pattern removal operation is applied to each positional parameter in turn, and the expansion is the resultant list. If parameter is an array variable subscripted with ‘@’ or ‘’, the pattern removal operation is applied to each member of the array in turn, and the expansion is the resultant list.

like image 126
Mu Qiao Avatar answered Oct 05 '22 20:10

Mu Qiao