批量重命名具有不同扩展名Linux Script的多个文件?

时间:2013-03-23 09:59:13

标签: linux shell scripting batch-rename

我想编写一个linux脚本,将所有文件移动或复制到具有相同文件名(但扩展名不同)的所有文件,同时保留其不同的扩展名。换句话说:

如果我从目录列表开始:

file1.txt, file1.jpg, file1.doc, file12.txt, file12.jpg, file12.doc

我想编写一个脚本来更改所有文件名而不更改扩展名。对于同一示例,选择file2作为新文件名,结果为:

file2.txt, file2.jpg and file2.doc, file12.txt, file12.jpg, file12.doc

因此,不会更改文件名与当前条件不匹配的文件。

祝福,

乔治

3 个答案:

答案 0 :(得分:5)

注意:如果变量file1.doc中有i,则表达式${i##*.}会在此情况下提取扩展名doc


一线解决方案:

for i in file1.*; do mv "$i" "file2.${i##*.}"; done

脚本:

#!/bin/sh
# first argument    - basename of files to be moved
# second arguments  - basename of destination files
if [ $# -ne 2 ]; then
    echo "Two arguments required."
    exit;
fi

for i in $1.*; do
    if [ -e "$i" ]; then
        mv "$i" "$2.${i##*.}"
        echo "$i to $2.${i##*.}";
    fi
done

答案 1 :(得分:4)

util-linux-ng软件包(大多数linux风格默认安装它)都有命令'rename'。有关使用说明,请参阅man rename。使用它可以简单地完成您的任务(rename file1 file2 file1.*

答案 2 :(得分:0)

要处理基本名称包含特殊字符的输入文件,我会将plesiv的脚本修改为以下内容:

if [ $# -ne 2 ]; then
    echo "Two arguments required."
    exit;
fi

for i in "$1".*; do
    if [ -e "$i" ]; then
        mv "$i" "$2.${i##*.}"
        echo "$i to $2.${i##*.}";
    fi
done

请注意1美元左右的额外报价。