将目录中所有文件的文件名中的字符替换为另一个

Replacing characters in filename of all files in a directory to another

我正在使用以下脚本将所有文件的文件名中的字符替换为另一个

#!/bin/ksh
for e in /mapr/datalake/rawfiles/P20170626005/* ;
do mv "$e" "echo $e | sed -e 's/\P20170626*/P20170626005/g'";done 

例如,尝试重命名 P201706260001.txt => P201706260050001.txt

但是出现错误:

cannot mv P201706260001.txt to P201706260050001.txt: no such file or directory.

请帮忙解决这个问题。

提示:使用类似的循环来显示您的输入和输出以查看您正在处理的内容,例如:

for e in /mapr/datalake/rawfiles/P20170626005/*
do
    echo "$e"
    echo "$e" | sed -e 's/\P20170626*/P20170626005/g'
done

你的 mv 命令似乎有问题。 Echo 应该反勾。

使用分组和反向引用进行高效转换。 您可以将脚本修改为

#!/bin/bash
for e in /mapr/datalake/rawfiles/P20170626005/*
do
    mv "$e" `echo $e | sed -e 's/\(.*\)P20170626\(.*\)/P20170626005/g'`
done 

(.*) - 组尾随/前导文件名。

\1 & \2 - 向后引用尾随/前导文件名