批量重命名文件

我想批量重命名目录中的一些文件,以便从文件名中去除前面的数字和henn。

Old file name: 2904495-XXX_01_xxxx_20130730235001_00000000.NEW New file name: XXX_01_xxxx_20130730235001_00000000.NEW 

我怎样才能做到这一点与Linux命令?

这应该使它:

 rename 's/^[0-9]*-//;' * 

它从头开始块[0-9] (即数字)多次,然后连字符-并从文件名删除它。


如果rename不在你的机器上,你可以使用循环和mv

 mv "$f" "${f#[0-9]*-}" 

测试

 $ ls 23-aa hello aaa23-aa $ rename 's/^[0-9]*-//;' * $ ls aa hello aaa23-aa 

要么:

 $ ls 23-a aa23-a hello $ for f in *; > do > mv "$f" "${f#[0-9]*-}" > done $ ls a aa23-a hello 

我觉得这个命令会更好,如果你执行下面的命令:

 ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 mv 

这里
ls * – 在curent文件夹中列出文件
sed -e – 执行表达式
磷; – 打印旧的文件名称
s / old-name / new-name / – 生成新的文件名
xargs -n2 – 处理mv的两个参数
MV – 获取两个参数,并执行移动操作

建议:在执行mv之前,验证你所做的是你想用echo实现的。

 ls * | sed -e 'p;s/old-name/new-name/' | xargs -n2 echo 

以下示例重命名

SCCF099_FG.gz5329223404623884757.tmp
SCCF099_FG.gz

 ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 echo ls *tmp | sed -e 'p;s/\([0-9]\)\+\.tmp/ /g' | xargs -n2 mv 

如果第一个数字总是相同的长度:

 for F in *new ; do mv $F ${F:8} done 

${parameter:number}进行子字符串扩展 – 从第8个字符开始。

在扩展中还有许多其他字符串编辑可用于处理其他情况。

使用重命名 (Windows,Mac和Linux友好):

 $ renamer --regex --find '\d+-(.*)' --replace '$1' * 

这将从当前目录中的所有文件的开始剥离所有数字和第一个连字符。

vimv让你使用Vim的文本编辑功能重命名多个文件。

进入vimv打开一个列出所有文件的Vim窗口,你可以进行模式匹配,视觉选择等来编辑名称。 在你退出Vim后,文件将被重命名。

自述文件中的屏幕截图显示了它如何解决原始海报的问题。

[免责声明:我是该工具的作者]

这可能看起来有点复杂,但是它非常有效,在* nix和OSX系统上都能很好地工作。 它也以递归方式进行操作,重命名当前目录中的文件以及任何子目录:

 find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \ cp temp1 temp2 && \ vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \ paste temp1 temp2 > temp3 && \ vi -c ":g/^/s//mv /" -c ":x" temp3 && \ sh ./temp3 && \ rm temp1 temp2 temp3 

以下是刚刚发生的事情:

第一行说找到( find )所有文件,从当前目录( . )中的文件开始,其名称与“7个数字的后面跟一个破折号,后跟0个或更多个字符”的模式( -regex'.*/[0-9]\{7\}[-].*' ),并将这些文件名和它们各自的路径( -print )写入名为temp1> temp1 )的文件。 请注意,在大多数情况下, -print指令可能不是必需的,但它不应该伤害任何东西。

 find . -regex '.*/[0-9]\{7\}[-].*' -print > temp1 && \ 

然后,将temp1的内容复制( cp )到一个名为temp2的文件中。

 cp temp1 temp2 && \ 

接下来,使用vi文本编辑器打开文件temp2并给vi两个命令(使用-c来表示每个新命令):

  1. 命令#1:
    • temp2:g )的每一行中搜索上面搜索的相同模式,除了这个时候使用圆括号( \([0-9]\{7\}[-]\)\(.*\) )。
    • 对于每个匹配行,将光标移动到找到匹配的位置,并将整个匹配替换为匹配模式( \2 )的第二个组。
  2. 命令#2:
    • 保存对temp2所做的更改并关闭文件( :x )。

其结果是:

  vi -c ":g/\([0-9]\{7\}[-]\)\(.*\)/s//\2/" -c ":x" temp2 && \ 

现在,将temp1temp2paste )的行连接起来, paste每个新组合的行写入一个名为temp3> temp3 )的文件中。

 paste temp1 temp2 > temp3 && \ 

接下来,再次运行vi ,执行与上面相同的步骤,除了这次搜索文件temp3内的每行( ^ )的开始并且在其之后( mv )之后添加mv和一个空格。

 vi -c ":g/^/s//mv /" -c ":x" temp3 && \ 

然后,将temp3./temp3 )的内容作为shell脚本( sh )执行。

 sh ./temp3 && \ 

最后,删除( rm )在整个过程中创建的每个临时文件。

 rm temp1 temp2 temp3 

你可以使用这个工具: rnm

代码做你想做的事情:

 rnm /path/to/the/directory -fo -dp -1 -rs '/^\d+-//' -ss '^\d+-' 

-fo仅用于文件模式
-dp是目录的深度( -1表示无限深度)。
-rs是替换字符串。 \d+-正则表达式被空字符串替换。
-ss是搜索字符串,它使用^\d+- regex搜索文件。 (虽然可以省略,但一些无害的错误消息将被打印在屏幕上)。

我真的很喜欢“重命名* .mp3 * .mp4”。

但没有其他答案给我这个。 所以我写了一个haskell程序来做到这一点。

https://hackage.haskell.org/package/batch-rename

有了这个你可以这样做:batch_rename“DCIM * .jpg”“* .png”

还有一个方便的GUI工具pyRenamer https://wiki.ubuntuusers.de/pyRenamer/