在 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
我想使用bash
、awk
、cut
、sed
重命名这些文件,以便获得输出:
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 上重命名多个文件,同时保持相同的扩展名的主要内容,如果未能解决你的问题,请参考以下文章