在带有空格的文件名上重命名失败

时间:2013-08-30 16:30:45

标签: ksh

我有一个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

挑战是一些文件中有空格(文件是从MS 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的样子(注意第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

我希望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

我错过了什么?

2 个答案:

答案 0 :(得分:0)

rename将重命名实际文件,而不是更改变量。使用tr或其他内容来修复内联文件名:

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

答案 1 :(得分: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

有趣的是它以这种方式工作,但不是一步到位。

感谢您的时间。