2011-03-31 168 views
2

有人可以創建一個短代碼,使用命令行選項-r來重命名子目錄中的文件擴展名嗎?使用大小寫和遞歸重命名文件擴展名

所以,如果我有一個名爲loc的文件夾中的文件a.txt。我輸入「change -r txt doc」,文件將成爲loc子目錄下的一個.doc文件(如loc/a.doc中)。

我需要將其添加到我的代碼。另外我之所以要使用case語句是因爲我將來會添加更多選項。

+0

您是否嘗試過?什麼沒有用?請提出具體問題。 – 2011-03-31 23:34:10

+0

我只是不能這樣做。我看了一個案例陳述的例子,我不知道如何將其應用於此。我試圖將它添加到這一點:在* $ 爲newext TXT 做 出口NAME ='基名$ newext $ .txt'做 – JonSmith 2011-03-31 23:39:44

+0

MV $ NAME $ .TXT $ NAME $ 2.doc 似乎不可思議想要將.txt重命名爲.doc。然後編寫一個自定義腳本來執行'find ... -exec mv「{}」...'無論如何,可能值得注意的是,某些發行版有一個很好的重命名命令,用Perl正則表達式:'rename's /\.txt$/.doc/'* .txt' – mivk 2011-11-24 23:44:05

回答

1

如果我正確理解您的問題,您想要遞歸更改文件擴展名。

腳本change.sh

# recursive rename:  ./change.sh -r -f txt -t doc 
# current directory only: ./change.sh -f txt -t doc 

find_depth="-maxdepth 1" # defaults to current directory 

while getopts "rf:t:" Option 
do 
case $Option in 
    f) from=$OPTARG ;; 
    t) to=$OPTARG ;; 
    r) find_depth="" ;; 
esac 
done 
shift $(($OPTIND - 1)) 

for file in $(find . $find_depth -name "*.$from") 
do 
    mv $file "${file/.$from/.$to}" 
done 

編輯響應您的評論。

+0

是的,就是這樣。有些問題,我如何將它應用於案例(我想爲此任務使用案例,因爲我想添加更多選項)?如果我想指定任何文件擴展名,我會使用$ 1和$ 2嗎?這將如何工作? – JonSmith 2011-03-31 23:48:58

+1

-1。如果文件名有空格怎麼辦?自從使用bash之後,使用'$()'而不是反引號 – kurumi 2011-04-01 00:09:18

+1

我在變量賦值中刪除了'='周圍的空格。 – 2011-04-01 00:16:11

1

要得到推廣和使用case/esac

extension=${filename##*.} 
case "$extension" in 
    "doc") ... ;; 
    "txt") ... ;; 
esac 
+0

有趣。感謝kurumi。 – JonSmith 2011-04-01 01:00:45