在bash中更改文件扩展名

时间:2015-10-11 10:53:43

标签: bash

您好我必须更改文件扩展名,但我必须在调用脚本

时键入它

所以我试着

 #!/bin/bash
echo "Hello "
roz1="$1"
roz2="$2"
katalog="$3" 
for i in `find . -name '*$roz1'`
do 
tmp=`basename $i $roz1t`
mv "${tmp}$roz1" "${tmp}$roz2"
done 

我键入/.script .txt .html 当我把它改成这个

#!/bin/bash
echo "Hello "
roz1="$1"
roz2="$2"
katalog="$3" 
for i in `find . -name '*.txt'`
do 
tmp=`basename $i .txt`
mv "${tmp}.txt" "${tmp}.html"
done

所有工作文件,我知道它是错误的$ 1 $ 2电话变量,但我无法修复它。

2 个答案:

答案 0 :(得分:3)

有几种快速简便的方法可以解决这个问题。在您尝试之后,我们从命令行获取当前和新的扩展。然后,您需要验证2个输入,然后从每个扩展的前面删除前导'.'(如果有),以便能够始终如一地处理带或不带前导点的用户输入。

然后,通过扩展名选择文件是一件简单的事情,并在删除不需要的扩展名并附加新扩展名时移动。这可以使用子字符串提取在一次调用中进行:

#!/bin/bash

[ -z $1 -o -z $2 ] && {  ## validate both extensions given
    printf "error: insufficient input. usage: %s ext1 ext2\n" "${0//*\//}"
    exit 1
}

ext1="$1"  ## assign input to variables
ext2="$2"

## remove leading '.' if it exists
#  allows handling with/without '.'
[ ${ext1:0:1} = . ] && ext1=${ext1:1}
[ ${ext2:0:1} = . ] && ext2=${ext2:1}

## read each file in list
while read -r fname; do

    ## simple move from ext1 to ext2 using substring extraction
    mv "$fname" "${fname%.$ext1}.$ext2"

done < <(find . -type f -name "*.$ext1")

exit 0

<强>解释

${var#expression}${var%expression}依赖参数扩展/子字符串删除。这是两种基本形式。第一个#表示从 LEFT 开始,从expression删除$var中的首次出现%变体从 RIGHT 开始。使用##%%说明在$var中删除所有出现的表达式。因此,"${fname%.$ext1}.$ext2"表示从完整文件名$ext1中移除$fname(第一个扩展名)的内容(从右侧开始 - 仅保留没有扩展名的文件名),然后{{1} (新扩展名)到最后(创建新文件名)。例如:

.$ext2

$ a=file.txt; echo ${a%.txt}; echo ${a%.txt}.html file file.html 类型是简单的字符串索引表达式。它们是${ext1:0:1}(如果没有${var:start:length},则默认为从字符串的开头到结尾)。所以length只是说跳过 1st char 并复制余数。 (如果它是ext1=${ext1:1},则基本上删除第一个字符。)您也可以从最后编制索引,但语法很特殊。要从最后开始编制索引,请使用'.'注意${var: -4:1} 之间的空格),或者您可以使用括号: -4。两者都从最后开始4个字符并获得1个字符(例如${var:(-4):1}中的.)。例如:

file.txt

测试完整脚本的文件

$ a=file.txt; b=file.txt; echo ${a: -4:1}; echo ${b:(-4):1}
.
.

使用/结果

将.txt扩展名更改为.html:

$  ls -1
chext.sh
file1.txt
file2.txt
file3.txt
file4.txt
file5.txt

答案 1 :(得分:1)

您应该阅读Quoting <{1}}实际上匹配文字$ roz1,它不会被展开。

您应该使用find . -name "*$roz"

等双引号