使用正则表达式重命名文件名

Posted

技术标签:

【中文标题】使用正则表达式重命名文件名【英文标题】:Rename a file name with regex 【发布时间】:2011-09-14 14:39:48 【问题描述】:

我在一个文件夹中有一组文件 (ABC.AM.*.*.20*.*)

例如:ABC.AM.00.13.201106.00014,我需要将其重命名为 ABC.AM.00.13.201106.01014。我在 AIX 中,所以重命名命令不可用。

只是一个伪脚本

for i in `ls ABC.AM.*.*.20*.*`
do
        mv $i DESIRED_file_name
done

任何帮助将不胜感激

【问题讨论】:

我很确定 rename 是开源的,并且可能在 AIX 上构建得很好。 @William Pursell 好吧,我不应该这样做..有什么解决办法吗? “不应该这样做”是什么意思?你的意思是你不能把它安装在/usr/bin 中?如果你在你的主目录中有写权限,你总是可以尝试 --prefix=$HOME 并在那里安装。 (但我不会打扰:rename 提供的功能很容易通过简单的 shell 脚本获得。) 【参考方案1】:

试试这个:

for arg in ABC.AM.*.*.20*.*
do
  newarg="$(echo "$arg" | sed 's/\(.*\..\)0\(.*\)/\11\2/')"
  if [ "$newarg" != "" ];then
    mv "$arg" "$newarg" 
  fi
done

【讨论】:

为什么要丢弃这些错误?如果文件没有被移动,用户肯定希望看到错误消息。 谢谢@John ..这真的很有帮助:)【参考方案2】:

目前尚不清楚您想要替换的确切内容,但对于您给出的特定示例,您可以这样做:

为了 ...;做 mv $i $i/00014/01014 完毕

这类事情的常用技术是使用 sed 生成新文件名:

对于...中的旧名称;做 new_name=$( echo $old_name | sed -e '...' ) mv $old_name $new_name 完毕

在执行此类操作时,最好将 'mv' 替换为 'echo' 并确保您有所需的替换,然后使用 'mv' 重新运行命令。

在你的情况下,你可能想要使用类似的东西:

sed -e 's/000\([0-9]\2\\)$/010\1/'

【讨论】:

感谢您的回复.. 我只想在第二个位置用 1 替换零,例如 00014/01014 00015/01015 00004/01004

以上是关于使用正则表达式重命名文件名的主要内容,如果未能解决你的问题,请参考以下文章

使用 python 重命名文件 - 正则表达式

在linux中使用正则表达式重命名文件

正则表达式批量重命名 OS X 终端中的文件

使用正则表达式重命名命令不起作用

在 bash 中使用正则表达式复制和重命名多个文件

Bash 正则表达式重命名文件