一行代码批量重命名文件

13

我在寻找一个 Linux 命令行一行代码,可以一次性重命名一堆文件。

pattern1.a  pattern1.b pattern1.c ...

执行命令后,我应该获得

pattern2.a  pattern2.b pattern2.c ...

可能是在Unix中重命名多个文件的重复问题。 - Greg Bacon
3个回答

13
for i in pattern1.*; do mv -- "$i" "${i/pattern1/pattern2}"; done

在运行之前,在mv前面加上echo,以查看它将要执行的操作。


11
如果你使用的是Linux操作系统,你可能会在路径 /usr/bin/rename(有时安装为“prename”)找到一个Perl脚本,它可以基于比shell globbing更复杂的模式重命名文件。
我其中一个系统上的 /usr/bin/rename 文档在这里。它可以像这样使用:
rename "s/pattern1/pattern2/" pattern1.*

许多其他Linux环境似乎有一个不同的rename,可以像这样使用:

rename pattern1 pattern2 pattern1.*

请在您的系统上查看man rename以获取详细信息。


2
为第二个重命名示例点赞;在网上搜索了很久,也找不到为什么s/pattern1/pattern2/无法工作的问题! - Corné Guijt

1

有很多方法可以解决这个问题。如果您更喜欢将模式作为正则表达式而不是文件通配符,并且希望递归地进行更改,您可以使用类似于以下内容的代码:

find . -print | sed -ne '/^\.\/pattern1\(\..*\)/s//mv "&" "pattern2\1"/p'

正如Kerrek在他的回答中建议的那样,这个首先会向你展示它将要做什么。一旦你熟悉了命令,就可以通过shell管道输出(即在末尾添加| sh)。

这对我很有效:

[ghoti@pc ~]$ ls -l foo.*
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 foo.txt
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p'
mv "./foo.txt" "bar.txt"
mv "./foo.php" "bar.php"
[ghoti@pc ~]$ find . -print | sed -ne '/^\.\/foo\(\..*\)/s//mv "&" "bar\1"/p' | sh
[ghoti@pc ~]$ ls -l foo.* bar.*
ls: foo.*: No such file or directory
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.php
-rw-r--r--  1 ghoti  wheel  0 Mar 26 13:59 bar.txt
[ghoti@pc ~]$ 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接