2011-09-20 103 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

相關問題