2013-08-30 132 views
0

我有一個KSH簡單腳本,用於創建我們在FTP服務器上收到的文件列表。使用空格的文件名重命名失敗

sF_Array=(` find . -type f ... `) 
sF_len=${#sF_Array[*]} 
for name in ${sF_Array[@]} 
do 
    basename "$name"   # This removes the leading slashdot 
done>$ddw_data/FTP_FILE_LIST 

挑戰是,一些文件有空格的(文件從微軟的Windows機器來給我們),所以我用rename

for name in ${sF_Array[@]} 
do 
    rename 's/ /_/g' "$name" # This removes spaces in file names 
    basename "$name"   # This removes the leading slashdot 
done>$ddw_data/FTP_FILE_LIST 

,但它並沒有工作。這是FTP_FILE_LIST樣子(通知第二和第三記錄/文件名):

TCA~PRE~PREP~9939985~ONTDTVE3A~33~F~3922~R22-100~000806451655~20130819~040320.XML 
J 
MEM~ETT~CVT~654687-MEMTO~jgm16227~1~P~1100~R24-500~033068658187~20130813~234639.XML 
J 
MEM~FUN~TEST~312326-MEMTO~jgm16227~2~P~1100~R24-200~035696412416~20130813~234638.XML 
J-MEM~DCA~FVT~5333131~ONTDTVD1C~1~F~3420~DECA1MR0-01~XED1B1201A3313~20130827~201916.XML 
TCA~COS~COSM~95518585~ONTDTVE7A~63~F~3911~R22-300~00065881346~20130817~000300.XML 

我想FTP_FILE_LIST看起來像這樣代替(注意第2和第3的記錄/文件名):

TCA~PRE~PREP~9939985~ONTDTVE3A~33~F~3922~R22-100~000806451655~20130819~040320.XML 
J_MEM~ETT~CVT~654687-MEMTO~jgm16227~1~P~1100~R24-500~033068658187~20130813~234639.XML 
J_MEM~FUN~TEST~312326-MEMTO~jgm16227~2~P~1100~R24-200~035696412416~20130813~234638.XML 
J-MEM~DCA~FVT~5333131~ONTDTVD1C~1~F~3420~DECA1MR0-01~XED1B1201A3313~20130827~201916.XML 
TCA~COS~COSM~95518585~ONTDTVE7A~63~F~3911~R22-300~00065881346~20130817~000300.XML 

什麼時我錯過了?

回答

0

rename將重命名實際文件,而不是更改變量。使用tr或東西要進行修改的文件名在線:

basename "$(echo "$name" | tr " " "_")" 
+0

我不知道這件事。謝謝。我認爲引用該變量將解析爲文件名。不幸的是,問題依然存在。 – Chris

+0

更新你的問題代碼,我會看看。 – jmh

0

我在我的腳本創建兩個獨立的任務解決我的問題:

1)用空格來重命名文件

find . -type f \(...\) | while read file 
do 
     target=`echo "$file" | sed 's/ /_/g'` 
     mv "$file" "$target" 
done 

2 )來創建我的文件列表

sF_Array=(` find . -type f ... `) 
sF_len=${#sF_Array[*]} 
for name in ${sF_Array[@]} 
do 
    basename "$name"   # This removes the leading slashdot 
done>$ddw_data/FTP_FILE_LIST 

有趣的是,它的工作原理WA但是並不是一步到位。

謝謝你的時間。