2017-07-02 114 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提供時間。我相信我的命令存在一些問題,尼特的答案已經解決。 :) –

相關問題