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

Posted

技术标签:

【中文标题】批量重命名具有不同扩展名Linux脚本的多个文件?【英文标题】:Batch Renaming multiple files with different extensions Linux Script? 【发布时间】:2013-03-13 04:49:17 【问题描述】:

我想编写一个 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

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

祝你好运,

乔治

【问题讨论】:

为什么 file2 匹配 file1 而不是 file12 ?同名长度,以一位数字结尾? 【参考方案1】:

util-linux-ng 软件包(大多数 linux 版本默认安装它)具有命令“重命名”。使用说明见man rename。使用它,您的任务可以简单地完成 rename file1 file2 file1.*

【讨论】:

【参考方案2】:

要处理基本名称包含特殊字符的输入文件,我会将 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 周围的额外引号。

【讨论】:

【参考方案3】:

注意:如果变量i 中有file1.doc,则表达式$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

【讨论】:

感谢您的建议。不幸的是,filename1 在脚本运行时是未知的。我正在处理数百个文件夹,其中将有 6 个文件,其中 3 个具有相同的文件名(可变的数字和字母列表),但有 3 个不同的扩展名。每个文件夹中只有 2 个文件名。示例:文件夹 1 包含:filetextwords12.gif、filetextwords12.jpg、filetextwords12.txt、filextwordste23.gif、filextwordste23.jpg、filextwordste23.txt。 Folder2 将包含类似的设置(2 个文件名,每个文件名 3 种不同的文件类型)。谢谢! GH 程序应该如何知道是更改filetextwords12 还是filetextwordste23 文件? filetextwordste23 是否也应该以 filetextwords12 应该的类似方式移动?如果您能详细说明一下,也许我们可以帮助您...

以上是关于批量重命名具有不同扩展名Linux脚本的多个文件?的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux 上重命名多个文件,同时保持相同的扩展名

Linux 批量重命名文件的方法

递归批量重命名文件扩展名(Windows批处理)

如何在 Linux 中批量移动复制追加和重命名文件

windows dos 批量重命名文件

windows dos 批量重命名文件