一个班轮重命名一堆文件
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 ~]$
【讨论】:
以上是关于一个班轮重命名一堆文件的主要内容,如果未能解决你的问题,请参考以下文章