在linux中使用mv重命名包含冒号的文件名

在linux中使用mv重命名包含冒号的文件名,linux,shell,unix,bash,Linux,Shell,Unix,Bash,我知道我的问题看起来很简单,但花了我一天的时间,没有运气。我检查了很多其他的帖子,但是没有一个能解决我的问题。我有一些档案 touch wrfchemi_d01_2010061500:00:00 touch wrfchemi_d01_2010061600:00:00 touch wrfchemi_d01_2010061700:00:00 touch wrfchemi_d01_2010061800:00:00 我想将它们重命名为: wrfchemi_d01_2010_06_15_00:00:00

我知道我的问题看起来很简单,但花了我一天的时间,没有运气。我检查了很多其他的帖子,但是没有一个能解决我的问题。我有一些档案

touch wrfchemi_d01_2010061500:00:00
touch wrfchemi_d01_2010061600:00:00
touch wrfchemi_d01_2010061700:00:00
touch wrfchemi_d01_2010061800:00:00
我想将它们重命名为:

wrfchemi_d01_2010_06_15_00:00:00 wrfchemi_d01_2010_06_16_00:00:00 wrfchemi_d01_2010_06_17_00:00:00 wrfchemi_d01_2010_06_18_00:00:00

我写了一个简单的脚本

for item in `ls wrfchemi*`
do
year=`echo "$item" | cut -c14-17`
mon=`echo "$item" | cut -c18-19`
day=`echo "$item" | cut -c20-21`
hr=`echo "$item" | cut -c22-23`
dat="wrfchemi_d01_"$year"_"$mon"_"$day"_"$hr":00:00"
echo $dat
mv $item "$dat"
done
它抛出了这个错误

mv:无法将“wrfchemi_d01_2010061500:00:00”移动到“wrfchemi_d01_2010_06_15_00:00:00”:没有这样的文件或目录

mv:无法将“wrfchemi_d01_2010061600:00:00”移动到“wrfchemi_d01_2010_06_16_00:00:00”:没有这样的文件或目录

mv:无法将“wrfchemi_d01_2010061700:00:00”移动到“wrfchemi_d01_2010_06_17_00:00:00”:没有此类文件或目录

mv:无法将“wrfchemi_d01_2010061800:00:00”移动到“wrfchemi_d01_2010_06_18_00:00:00”:没有此类文件或目录

更新:

真奇怪。它在终端中也会失败,而文件确实存在。它会自动将“\”添加到零

但它仍然会导致错误

没有这样的文件或目录


通过使用
重命名
,感谢您:

rename 's/_(\d{4})(\d{2})(\d{2})/_$1_$2_$3_/' wrfchemi_d01_??????????:*
通过使用:


你能在同一个目录中手动执行
mv
吗?不确定这是否是你的问题,但第一行更安全、更有效,就像wrfchemi*
中的项目那样。您可能还希望将
ls-l$dat
touch$item
添加到脚本中,以确保文件位于您认为的位置,并且能够按预期在该目录中创建文件。哪个操作系统和哪个文件系统?我还建议运行
set-x
来启用日志记录。作为一个完全无关的问题——永远不要在脚本中使用
ls
;它只供互动使用。为wrfchemi*中的项目运行
;独自做…
;“这既快又准确。”纳蒂尔德雷奇很奇怪。当文件确实存在时,它在终端中也会失败。它会自动添加\“mv wrfchemi_d01_2010061500\:00\:00 wrfchemi_d01_2010_06_15_00:00:00”顺便说一句,
echo“$item”| cut…
效率很低。运行
year=${item:13:4}
要快得多。请参见具体描述该语法(参数扩展),或者,如何在bash中进行字符串操作?我在centos中(在bash脚本中)尝试了您的代码,结果成功了。非常感谢。
rename 's/_(\d{4})(\d{2})(\d{2})/_$1_$2_$3_/' wrfchemi_d01_??????????:*
for file in wrfchemi_d01_??????????:*;do
    mv "$file" "${file:0:17}_${file:17:2}_${file:19:2}_${file:21}"
done