Bash脚本重命名文件扩展名

时间:2016-08-19 16:40:32

标签: bash rename

#!/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。参数$2txt。所以,我对它的含义感到困惑。

我可以运行以下行并且它可以正常工作,但我想让它接受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

请帮忙!

谢谢!

1 个答案:

答案 0 :(得分:1)

获取shell解释的参数,删除单引号:

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

或(如果你想保留引号)

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

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