2012-11-12 116 views
2

我需要編寫一個shell腳本來將圖像格式從.png轉換爲.tif。腳本如下:使用shell腳本處理文件名:更改文件擴展名

#!/bin/sh 

for f in `ls *.png` 
do 
    convert $f $f.tif 
done 

但是這樣做會將.tif格式附加到現有的文件名。即,如果圖像是abc.png,則$ f將具有abc.png,並且在將文件名轉換爲abc.png.tif之後。這不是我想要的。我需要它是abc.tif。我如何操作$ f來刪除.png?

+1

[不要」解析'ls'(HTTP://mywiki.wooledge .org/ParsingLs) –

回答

6

這應該爲你工作:

#!/bin/bash 

for file in *.png 
do 
    filename=$(basename "$file") 
    filename=${filename%.*} 
    convert $file $filename.tif 
done 

的線路由行演練的是如何工作的:

  • for file in *.png - 你不需要命令替換ls *.png得到的名單帶有png擴展名的文件。通配符*將在shell中自動擴展以匹配cwd中的文件列表;在這種情況下,文件列表以.png結尾。
  • filename=$(basename "$file") - 這隻適用於防禦性編程;它得到文件的實際名稱
  • filename=${filename%.*} - 這將刪除filename
  • convert $file $filename.tif擴展 - 運行實際的轉換命令
+0

或者只是:for * in * .png;做轉換$ f $ {f%.png} .tif;完成您不需要基本名稱,因爲您正在列出當前目錄中的文件。 – dimir

+0

@dimir - 如上所述,「basename」部分僅用於防禦性編程。如果'* .png'變成'$(find $ PWD -name'* .png')' –

+2

',那麼它會使代碼更健壯。但是如果他這樣做了,不應該把結果放到包含子目錄的子目錄中正在轉換的文件,而不是當前目錄?另外,如果你使用'basename',爲什麼不使用它的第二個參數來刪除'.png'後綴? – Barmar