2011-09-20 70 views
0

我正在处理一些与转换文件相关的东西,我试图找到一个shell命令来删除原始文件扩展名。例如,如果我转换一个名为text.rtf的文件,它将被转换为text.rtf.mobi。我想用一些东西来删除.rtf(或任何其他扩展名),所以它只是text.mobi使用Awk删除多个文件扩展名中的一个?

我一直在玩awk和sed,但是我什么都不能工作。我不知道如何让它获取原始扩展名和.mobi,但只删除原始扩展名。

有点相关,我应该在哪里拿起正则表达式,并真正理解它,而不是只是大量的谷歌搜索?谢谢。

编辑:我原来的文章有点不清楚,所以让我澄清。我需要的shell命令是用于删除转换文件中的原始扩展名,例如text.ANYTHING.mobi。对此感到抱歉。

回答

1
for f in *.mobi 
    do 
    mv $f $(echo $f | cut -d'.' -f1).mobi 
    done 
+0

将'important.document.v1.rtf.mobi'损坏到'important.mobi'中。 –

+0

是的我认为这是他的意思 –

+0

是的!这个!非常感谢! – Kristian

4

的经典方法是basename命令:

file="text.rtf" 
new=$(basename "$file" .rtf).mobi 

更现代的方式避免了行使其他程序:

file="text.rtf" 
new="${file%.rtf}.mobi" 

如果你真的必须使用awk,那么我想你使用:

file="text.rtf" 
new=$(echo "$file" | awk '/\.rtf$/ { sub(/\.rtf$/, ".mobi"); } { print }') 

对于sed,哟u使用:

file="text.rtf" 
new=$(echo "$file" | sed 's/\.rtf$/.mobi/') 

正则表达式的一个很好的解释,那么你要弗里德尔的"Mastering Regular Expressions"书。


text.rtf.mobi转换为text.mobi,你可以使用任何先前细微调整显示的工具:

new=$(basename "$file" .rtf.mobi).mobi 
new="${file%.rtf.mobi}.mobi" 
new=$(echo "$file" | awk '/\.rtf\.mobi$/ { sub(/\.rtf\.mobi$/, ".mobi"); } { print }') 
new=$(echo "$file" | sed 's/\.rtf\.mobi$/.mobi/') 

,事情仅略有不同,如果.rtf可以是任何其他扩展名,但你开始问自己:“为什么不在转换文件之前从文件中删除原始扩展名,或者使用转换器中的文件命名工具来获取所需的输出名称?”

basename不再有明智的做法。

new="${file/.[!.]*.mobi/}" # bash 
new=$(echo "$file" | awk '/\.[^.]+\.mobi$/ { sub(\.[^.]*\.mobi$/, ".mobi"); } { print }') 
new=$(echo "$file" | sed 's/\.[^.]*\.mobi$/.mobi/') 
+0

我很喜欢这个,但是 - 正如你在原始问题中看到的那样,我认为它有点被误解了。我想用通配符扩展名为_followed_的文件并删除第一个扩展名。这与你已经建议的代码完全不同吗? – Kristian

6

只是删除所有的扩展名,然后添加回去.mobi

$ x=something.whatever.mobi 
$ echo ${x%%.*}.mobi 
something.mobi 
+1

如果您忙于阅读Jonathan Leffler的回答,请阅读本文。 +1 – tripleee

1
for f in *.mobi 
do 
mv $f `echo $f|awk -F"." '{print $1"."$3}'` 
done 
1

下面是使用xargs的和基本名称,去除其中的文件名.WAV波浪的批量转换的示例使用lame将文件转换为mp3:

/bin/ls | xargs -I%basename%“.wav”| xargs -I $ lame --tl Xenologix --taDrøn--tg IDM --tt $ $ .wav $。mp3

+0

良好的xargs进入基名称技巧。否则,请不要分析LS的输出。 – Marcin

相关问题