繁体   English   中英

在bash中更改文件扩展名

[英]Changing file extension in 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 call,但我无法修复它。

有几种快速简便的方法可以解决此问题。 根据您的尝试,我们从命令行获取当前和新的扩展名。 然后,您需要验证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}依赖于参数扩展/子字符串移除 这是两种基本形式。 第一个带有# expressionLEFT开始从$var删除expression 第一次出现的内容。 %变体从RIGHT开始。 使用##%%表示删除$var所有出现的表达式。 因此, "${fname%.$ext1}.$ext2"表示从完整文件名$fname (从右起-仅保留文件名不带扩展名)中删除$ext1 (第一个扩展名)的内容,然后添加.$ext2 (新扩展名)结尾(创建新文件名)。 例:

$ a=file.txt; echo ${a%.txt}; echo ${a%.txt}.html
file
file.html

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

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

完整脚本的测试文件

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

使用/结果

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

$ bash chext.sh txt html

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

您应该阅读有关报价的信息
find . -name '*$roz1' find . -name '*$roz1'实际上将与文字$ roz1匹配,因此不会扩展。

您应该使用双引号,如find . -name "*$roz" find . -name "*$roz"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM