您好我必须更改文件扩展名,但我必须在调用脚本
时键入它所以我试着
#!/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电话变量,但我无法修复它。
答案 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"