2016-08-19 179 views
0
#!/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脚本重命名文件的扩展名

bash rename_file_extensions.sh . txt html 

输出示例:

Use of uninitialized value $2 in regexp compilation at (eval 6) line 1. 

line 1包含上述if statement。参数$2txt。所以,我对它指的是什么感到困惑。

我可以运行下面的线,它完美的作品,但我想拥有它接受bash的论点:

find . -name "*.txt.html*" -exec rename 's/\.txt.html.html.html$/.html/' '{}' \; 

在这种情况下,你可以看到,有很多不正确的文件扩展名。这条线纠正了所有这些。

我试图编辑find行:

find "${1}" -name '*."$2"*' -exec rename 's/\."${2}"$/."${3}"/' '{}' \; 

这让我向前没有错误;然而,没有输出,并且当我运行以下命令bash rename_file_extensions.sh . txt html时,并没有将txt扩展名更改为html

请帮忙!

谢谢!

回答

1

获得通过shell来解释参数,落单引号:

尝试

find "$1" -name "*.$2*" -exec rename "s/\.${2}\$/.${3}/" '{}' \; 

或者(如果你想保持引号)

find "$1" -name "*.$2*" -exec rename 's/\.'"${2}"'$/.'"${3}"'/' '{}' \; 

(我会附上-name在双引号或bash中的完整参数可以直接扩展参数,如果某些文件在当前目录中匹配)

+0

我使用'find'$ 1“-name”*。$ 2 *“-exec rename's/\'。”$ {2}“'$ /。'”$ {3}“'/''{}' \;'而且效果很棒!谢谢! – Debug255