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

Posted

技术标签:

【中文标题】在 Linux 上重命名多个文件,同时保持相同的扩展名【英文标题】:Rename multiple files while keeping the same extension on Linux 【发布时间】:2014-11-28 11:36:40 【问题描述】:

我在具有以下命名约定的目录中有 100 多个文件。

00XYZCD042ABCDE20141002ABCDE.XML
00XYZCC011ABCDE20141002.TXT
00XYZCB165ABCDE20141002ABCDE.TXT
00XYZCB165ABCDE20141002ABCDE.CSV

我想使用bashawkcutsed 重命名这些文件,以便获得输出:

XYZCD042.XML
XYZCC011.TXT
XYZCB165.TXT
XYZCB165.CSV

所以基本上,总是删除前两个 0,然后保留所有内容直到 ABCDE 开始,然后删除包括 ABCDE 在内的所有内容并保留文件扩展名。

【问题讨论】:

【参考方案1】:
for i in *; do
    mv $i $(echo $i | sed -e 's/^00//' -e 's/ABCDE2014[^.]*//');
done

【讨论】:

【参考方案2】:

仅限 Bash:

for fn in *; do
    A=$fn#00
    mv $fn $A/ABCDE*./.
done

for 循环中的第一行去掉 00 前缀,第二行去掉 ABCDE 后缀(最多一个点),然后执行重命名。

【讨论】:

+1,只是指出它也适用于 zsh 和 ksh,可能还有一些我想不到的。 如果您添加了解释,这将是一个rockin' 答案。 绝妙的解决方案,只有一个问题,可以将这个 A=$fn#00 更改为取任意两位数而不是 00 吗? 显然这行得通:A=$fn#[0-9][0-9] 如果第二行中的 ABCDE 并不总是 ABCDE 而是可变的呢?请问有什么正则表达式吗?认为 [a-z] 可能有效,但没有。非常感谢您的帮助。 您应该弄清楚该变量采用什么形式并编写适当的表达式。由于您没有在问题中指定任何有关可变性的内容,因此我无法为您提供帮助。【参考方案3】:

你可以试试下面的rename 命令,

rename 's/ABCDE.*(\..*)/$1/;s/^00//' *

说明:

s/ABCDE.*(\..*)/$1/ 匹配从第一个 ABCDE 到最后一个的所有字符,并且仅捕获扩展部分。然后将所有匹配的字符替换为捕获的扩展名。 s/^00// 那么这将删除前两个零。

【讨论】:

【参考方案4】:
for file in *
do
    mv -- "$file" "$file:2:8.$file#*."
done

除非您有特定目的并了解所有影响,否则请务必引用您的变量。

【讨论】:

以上是关于在 Linux 上重命名多个文件,同时保持相同的扩展名的主要内容,如果未能解决你的问题,请参考以下文章

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

在 Windows 上重命名 DLL

在代码上重命名 Android 文件夹

python 如何在Python上重命名文件的示例

在 ruby​​ on rails 上重命名上传文件

Google Cloud Storage - 在 GUI 上重命名/移动文件/文件夹