2011-03-22 78 views
0

我试图创建一个shell脚本,当你键入这样的事情到终端,将改变文件extenstion:帮助这个.SH代码

extcha XX YY * .XX

这是我的代码产生

#!/bin/sh 

while [ *.$1 ] ; do 

    export name=`basename $i .$1` 
    echo mv $name.$1 $name.$2 

done; 

这似乎并没有工作。有人能告诉我我哪里出错了吗?

+0

并不需要执行的命令,而不是仅仅呼应呢? – Pablitorun 2011-03-22 20:55:36

+0

@Pablitorun,谢谢你指出。它仍然无法正常工作。 – 2011-03-22 20:59:06

+0

[重命名没有指定的文件扩展名]可能的重复(http://stackoverflow.com/questions/6068733/renaming-a-file-extension-without-specifying) – Johnsyweb 2011-05-24 01:47:38

回答

0

您可以使用rename实用程序...它这样做。

编辑:脚本。

#!/bin/bash 

from="$1" 
shift 
to="$1" 
shift 

IFS=" 
" 
for f in [email protected] 
do 
    basefile="`basename "$f" ".$from"`" 
    if [ ! "$basefile" = "$f" ] 
    then 
    echo mv "$basefile.$from" "$basefile.$to" 
    fi 
done 
+0

请注意,有两种不同的重命名通常在Linux中分发,[相当简单的](http://linux.die.net/man/1/rename)做简单的字符串替换,[更强大的](http://man.he.net/man1/rename )使用Perl正则表达式。我相信前者用于redhat系列,后者用于debian/ubuntu系列 - 不知道其他发行版。 – Cascabel 2011-03-22 21:01:28

+0

我想要做的是使用一段时间的状态,将找到所有的xx扩展名($ 1)并将其更改为yy扩展名($ 2)。基本上我想用一个while循环执行这个文件。 – 2011-03-22 21:01:35

+0

@Mr牙齿:是的,但为什么?重命名实用程序可以为你做到这一点。 – Erik 2011-03-22 21:03:13

0

更改为:

for i in *.$1 ; do 


    name=`basename $i .$1` 
    mv $name.$1 $name.$2 

done 

不要忘记添加一些错误检查(即有两个参数为例)

+0

如果没有以$ 1结尾的文件,或者$ 1包含空格,则会中断。 – Erik 2011-03-22 21:13:02

+0

感谢更正/代码。 :) – 2011-03-22 21:23:15

+0

@Eric,这可能是为什么我建议添加一些错误检查:( – KevinDTimm 2011-03-23 12:37:29

2

这里是你的意思做的:

for name in *.$1; do 
    stripped_name="$(basename "$name" ".$1")" 
    mv "$name.$1" "$name.$2" 
done 

你的大缺陷是while循环只是评估那个条件,有效地测试存在具有该表格名称的文件。它不会在任何变量中存储任何东西 - 当然不是像$i这样的任意东西。你也不需要在这里输出任何东西。这只会让子进程可见,而您不需要。

当然,你可以真的只是使用重命名工具。有了基本的一个(RedHat和朋友):

# Note that this will actually rename abc.foo.foo to abc.bar.foo 
# since it replaces the first match. 
rename .foo .bar *.foo 

,并与花哨的perl的一个(于Debian/Ubuntu):

rename 's/.foo$/bar/' *.foo 
+0

好吧,非常感谢提示/代码Jefromi。 – 2011-03-22 21:24:35