重命名文件扩展名而不指定

时间:2011-05-20 07:23:27

标签: bash shell

我正在创建一个bash shell脚本,它将重命名文件扩展名,而不必指定旧的文件扩展名。如果我在Linux中输入“change foo *”到终端,它会将所有文件扩展名更改为foo。

所以我要说我有四个文件:“file1.txt”,“file2.txt.txt”,“file3.txt.txt.txt”和“file4。”

当我运行命令时,文件应如下所示:“file1.foo”,“file2.txt.foo”,“file3.txt.txt.foo”和“file4.foo”

有人可以查看我的代码并更正它。如果有人能为我实现这一点,我也将不胜感激。

    #!/bin/bash

    shift

    ext=$1

    for file in "$@"
    do
        cut=`echo $FILE |sed -n '/^[a-Z0-9]*\./p'`
        if test "${cut}X" == 'X'; then
            new="$file.$ext"
        else
            new=`echo $file | sed "s/\(.*\)\..*/\1.$ext/"`
        fi
        mv $file $new
    done
    exit

4 个答案:

答案 0 :(得分:5)

  • 始终在变量替换周围使用双引号,例如echo "$FILE"而非echo $FILE。如果没有双引号,shell会在变量的值中展开空格和glob字符(\[*?)。 (在某些情况下,您不需要引号,有时您确实需要分词,但这是为了将来的课程。)
  • 我不确定你要用sed做什么,但不管它是什么,我相信它在shell中是可行的。
    • 检查$FILE是否包含点:case "$FILE" in *.*) echo yes;; *) echo no;; esac
    • $FILE ${FILE%.*}中删除最后一个分机号。例如,如果$FILEfile1.txt.foo,则会生成file1.txt。更一般地说,${FILE%SOME_PATTERN}扩展为$FILE,其中最短的后缀匹配SOME_PATTERN被剥离。如果没有匹配的后缀,则会扩展为$FILE不变。变体${FILE%%SOME_PATTERN}删除最长的后缀。同样,${FILE#SOME_PATTERN}${FILE##SOME_PATTERN}会删除后缀。
  • test "${TEMP}X" == 'X'很奇怪。这看起来像是过去被误读的伎俩。正常的写作方式是[ "$TEMP" = "" ][ -z "$TEMP" ]。使用==代替=是bash扩展名。如果$TEMP看起来像一个操作员,那么曾经有错误的shell可能会错误地解析命令,但是这些已经成为了恐龙的方式,即使这样,X也需要在开头,因为有问题的运算符以-[ "X$TEMP" == "X" ]开始。
  • 如果文件名以-开头,mv会认为它是一个选项。使用--说“就是这样,没有更多选项,以下是操作数”:mv -- "$FILE" "$NEW_FILE"
  • 这是非常小的,但常见的(非通用的)约定是对环境变量使用大写字母,对内部脚本变量使用小写字母。
  • 由于您只使用标准shell功能,因此可以使用#!/bin/sh启动脚本(当然,#!/bin/bash也可以使用)。
  • 脚本末尾的
  • exit没用。

应用所有这些,这是生成的脚本。

#!/bin/sh
ext="$1"; shift
for file in "$@"; do
  base="${file%.*}"
  mv -- "$file" "$base.$ext"
done

答案 1 :(得分:1)

不完全是您要问的内容,但请查看perl rename实用程序。很强大! man rename是一个好的开始。

答案 2 :(得分:1)

使用:用于* .gif中的文件;做mv $ file $ {file%.gif} .jpg;完成

或者查看How to rename multiple files

答案 3 :(得分:0)

对我来说这很有用

for FILE in `ls`
do
NEW_FILE=${FILE%.*}
NEW_FILE=${NEW_FILE}${EXT}
done

我只是想谈谈NEW_FILE=${FILE%.*} 这里NEW_FILE获取文件名作为输出。你可以随意使用它。
我用b uname -a = "Linux 2.4.20-8smp #1 SMP Thu Mar 13 17:45:54 EST 2003 i686 i686 i386 GNU/Linux"

测试了bash