使用shell脚本时,如何复制名称包含空格和UNICODE的文件?

时间:2010-03-31 05:55:19

标签: bash shell unicode file scripting

我有一个文件列表,我试图在bash shell脚本中复制和移动(使用cp和mv)。我遇到的问题是,我无法获得任何命令来识别大量文件,似乎因为文件名包含空格和/或unicode字符。我找不到任何开关来解码/重新编码这些字符。相反,例如,如果我复制“file name.xml”,我会得到“* .xml”和脚本错误,表明找不到我的结果文件。有没有人知道将处理这些文件的设置或命令?

编辑(添加当前代码): 我跑的时候:

MacBookPro:桌面$ ./script.sh

#!/bin/sh
dateVar=`date +%Y-%m-%d`
mkdir /Volumes/Documents/SMSarchive/$dateVar
cd /Volumes/Documents/SMSarchive/SMSdrop
for i in *.xml
do
cp $i /Volumes/Documents/SMSarchive/$dateVar/$dateVar-$i
done

我收到消息:

用法:cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file target_file        cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file ... target_directory

...当它命中“cp”命令时。脚本实际上还有更多,它可以进一步处理复制的文件。使用“常规”文件名,例如'file.xml',一切正常。它只是带有空格或Unicode字符的文件,我遇到了问题。

3 个答案:

答案 0 :(得分:17)

空格问题表明报价不足。以下是不正确的:

someprogram $file

正确的版本如下:

someprogram "$file"

答案 1 :(得分:1)

当$ i为null时,请注意代码错误! 这可能是致命的rm -Rf错误的结果!

答案 2 :(得分:0)

有时比处理shell引用更简单。在您的情况下,我会使用find -print0xargs -0。空字符终止允许您使用空格(即文件名列表)轻松操作字符串。

对于您的示例,代码看起来像这样:

#!/bin/sh
dateVar=`date +%Y-%m-%d`
mkdir /Volumes/Documents/SMSarchive/$dateVar
cd /Volumes/Documents/SMSarchive/SMSdrop
find . -maxdepth 1 -name '*.xml' -print0 | \
xargs -0 -I {} cp {} /Volumes/Documents/SMSarchive/$dateVar/$dateVar-{}