2017-07-02 119 views
-1

我使用下面的脚本中的所有文件的文件名替换字符替换中的所有文件的文件名字符到另一个目录中的另一个

#!/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.

请帮忙解决这个问题。

+1

取代单曲/ \ P20170626 */P20170626005 /'是很值得怀疑 – RomanPerekhrest

+1

的正则表达式为'sed'和通配符壳都使用'* '但它意味着不同的(但相关的)事情。 shell中的'*'大致等同于'sed'中的'。*'。 '\ P ...'中的反斜杠很奇怪。 –

+0

由于您已标记'bash',请考虑使用http://mywiki.wooledge.org/BashGuide/Parameters#Parameter_Expansion而不是sed ... – Sundeep

回答

1

似乎没有要与你的mv命令的问题。回声应该回复。

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

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

(*) - 集团尾随/领先的文件名。

\ 1 & \ 2 - 返回参考尾随/领先的文件名

+0

非常感谢。这对我有效。 :) –

0

提示:使用类似的循环,以显示你的投入和产出,看你处理什么用,如:

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

感谢您为此问题markp提供时间。我相信我的命令存在一些问题,尼特的答案已经解决。 :) –

相关问题