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