一个班轮重命名一堆文件

Posted

技术标签:

【中文标题】一个班轮重命名一堆文件【英文标题】:One liner to rename bunch of files 【发布时间】:2012-04-10 06:00:33 【问题描述】:

我一直在寻找一个 linux 命令行单行器来一次性重命名一堆文件。

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

一旦命令被执行,我应该得到

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

【问题讨论】:

Rename multiple files in Unix的可能重复 【参考方案1】:
for i in pattern1.*; do mv -- "$i" "$i/pattern1/pattern2"; done

在运行它之前,在 mv 前面粘贴一个 echo 以查看它做什么。

【讨论】:

【参考方案2】:

如果您碰巧使用的是 Linux,您可能还会在 /usr/bin/rename(有时安装为“prename”)有一个 perl 脚本,它可以根据比 shell globbing 允许的更复杂的模式重命名文件。

我的一个系统上的 /usr/bin/rename 记录在 here。可以这样使用:

rename "s/pattern1/pattern2/" pattern1.*

许多other Linux environments 似乎有一个不同的rename 可以这样使用:

rename pattern1 pattern2 pattern1.*

查看系统上的man rename 了解详情。

【讨论】:

为第二个重命名示例点赞;搜索了整个网络,找不到"s/pattern1/pattern2/" 不起作用的问题!【参考方案3】:

有很多方法可以给这只猫剥皮。如果你希望你的模式是一个正则表达式而不是一个 fileglob,并且你想递归地进行更改,你可以使用这样的东西:

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 ~]$ 

【讨论】:

以上是关于一个班轮重命名一堆文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 dplyr 重命名未命名的变量

bash 通过添加数字批量重命名文件

递归重命名文件 Mac OSX

Bash 正则表达式重命名文件

如何使用终端一次重命名多个文件?

查找和重命名没有扩展名的文件?