2011-03-31 172 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