我正在创建一个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
答案 0 :(得分:5)
echo "$FILE"
而非echo $FILE
。如果没有双引号,shell会在变量的值中展开空格和glob字符(\[*?
)。 (在某些情况下,您不需要引号,有时您确实需要分词,但这是为了将来的课程。)$FILE
是否包含点:case "$FILE" in *.*) echo yes;; *) echo no;; esac
$FILE
${FILE%.*}
中删除最后一个分机号。例如,如果$FILE
为file1.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"
。#!/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;完成
答案 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"