#!/bin/bash
if [[ "$#" -lt 3 ]]; then
echo "USAGE: enter the following arguments:
1st argument = starting directory path (e.g. . for working directory)
2nd argument = old file extension (e.g. txt)
3rd argument = new file extension (e.g. html
Note: Do not enter any . or \. for the 2nd and 3rd arguments
"
else
find "$1" -name *."$2"* -exec rename 's/\."${2}"$/."${3}"/' '{}' \;
fi
示例输入:
bash rename_file_extensions.sh . txt html
示例输出:
Use of uninitialized value $2 in regexp compilation at (eval 6) line 1.
line 1
包含上面的if statement
。参数$2
为txt
。所以,我对它的含义感到困惑。
我可以运行以下行并且它可以正常工作,但我想让它接受bash参数:
find . -name "*.txt.html*" -exec rename 's/\.txt.html.html.html$/.html/' '{}' \;
在这种情况下,正如您所看到的,有很多不正确的文件扩展名。这条线纠正了所有这些。
我尝试将find
行编辑为:
find "${1}" -name '*."$2"*' -exec rename 's/\."${2}"$/."${3}"/' '{}' \;
这让我可以毫无错误地前进;但是,当我运行以下命令txt
时,没有输出,并且它没有将html
扩展名更改为bash rename_file_extensions.sh . txt html
。
请帮忙!
谢谢!
答案 0 :(得分:1)
获取shell解释的参数,删除单引号:
试
find "$1" -name "*.$2*" -exec rename "s/\.${2}\$/.${3}/" '{}' \;
或(如果你想保留引号)
find "$1" -name "*.$2*" -exec rename 's/\.'"${2}"'$/.'"${3}"'/' '{}' \;
(我会将-name
的完整参数括在双引号中,或者bash可以直接扩展参数,如果某些文件在当前目录中匹配的话)