2012-11-29 315 views
2

我正在介绍Unix类,并被困在最终的作业上。我需要编写一个脚本来更改脚本运行时输入的文件名的文件扩展名。当脚本运行时,新的文件扩展名也被输入。该脚本调用chExt1.sh。我们的脚本的第一次试验如下在unix中更改文件扩展名

./chExt1.sh cpp aardvark.CPP 

剧本是想改变第二个输入文件扩展名的第一个输入指定的文件扩展名运行。假设文件名或文件扩展名是作为新扩展名提供的文件扩展名并不重要,也不只是将大写字母改为小写字母。希望在以下情况下做到这一点非常清楚:

./chExt1.sh istink helpme.plEaSe 

该脚本会将helpme.plEaSe更改为helpme.istink。我在这个论坛和谷歌搜索,并没有看看我尝试了不同的例子,我发现。以下是我尝试过的一些示例以及我目前的示例。 当前

#!/bin/sh 
fileExtension="$1" 
shift 
oldName="$2" 
shift 
newName=${oldName%%.*}${fileExtension} 
echo $newName 

回声只是为了看看它是否工作,如果我得到它的工作我要添加一个MV保存。 别人认为我曾尝试:

newName=`${oldName%.*}` 
newName=`${oldName#.*}` 
sed 's/\.*//' $oldName > $newName 

我似乎无法找到一些其他的sed的我已经使用,但他们参与反斜杠了很多,()与*在那里。我没有尝试basename命令,因为我不知道要输入的文件扩展名,而我看到的所有示例都需要指定要删除的内容,而我不能。我没有列出我用过的所有不同的引用变体,但我已经尝试了很多。我的指令说使用sed命令,因为我们应该知道如何使用该类,但是当我尝试这样做时,我不会隔离文件的结尾,我相信(因为它需要很长时间才能完成),所以它正在浏览整个文件并且在继续执行之后寻找.s和任何东西。*作为模式。谢谢你提供的所有帮助。

+0

[man rename](https://www.google.com/search?q=man+rename&oq=man+rename&aqs=chrome.0.57j60l3j65l2.2208&sourceid=chrome&ie=UTF-8) –

+1

sample'rename -ns/\ .txt $/\。aaa/* .txt' –

回答

1

shift移动位置参数,所以在调用shift之后第二个参数($ 2)现在是第一个($ 1)。第二个转变不是必需的,因为您已完成访问参数。您需要删除班次

#!/bin/sh 
fileExtension="$1" 
oldName="$2" 
newName=${oldName%%.*}${fileExtension} 
echo $newName 

或将$ 2更改为$ 1。

#!/bin/sh 
fileExtension="$1" 
shift 
oldName="$1" 
newName=${oldName%%.*}${fileExtension} 
echo $newName 

但是,您仍然缺少新文件名中的点。这留给了读者一个练习。

+0

非常感谢您,我尝试删除第二个班次,但没有成功。但是当我将$ 2更改为$ 1时,它效果很好。感谢您指出我错过了这个点,我可能会完成整个任务而没有捕捉到它。 – gimpdogg

+0

“我尝试删除第二班”。第二班没有任何效果,你可以保留或删除它;无论哪种方式都没有关系。解决方案是将$ 2更改为$ 1或删除_first_班次。如果你的问题解决了,请选择我的答案。 – Enrico