Bash 使用shell脚本时,如何复制名称包含空格和UNICODE的文件?
我有一个在bashshell脚本中尝试复制和移动(使用cp和mv)的文件列表。我遇到的问题是,两个命令都无法识别大量文件,这似乎是因为文件名包含空格和/或unicode字符。我找不到任何开关来解码/重新编码这些字符。相反,例如,如果我复制“file name.xml”,我会得到“*.xml”和一个脚本错误,结果中找不到该文件。有人知道处理这些文件的设置或命令吗 编辑(添加当前代码): 当我跑步时: MacBookPro:Desktop$./script.shBash 使用shell脚本时,如何复制名称包含空格和UNICODE的文件?,bash,shell,unicode,file,scripting,Bash,Shell,Unicode,File,Scripting,我有一个在bashshell脚本中尝试复制和移动(使用cp和mv)的文件列表。我遇到的问题是,两个命令都无法识别大量文件,这似乎是因为文件名包含空格和/或unicode字符。我找不到任何开关来解码/重新编码这些字符。相反,例如,如果我复制“file name.xml”,我会得到“*.xml”和一个脚本错误,结果中找不到该文件。有人知道处理这些文件的设置或命令吗 编辑(添加当前代码): 当我跑步时: MacBookPro:Desktop$./script.sh #!/bin/sh dateVar=
#!/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]源文件目标文件
cp[-R[-H |-L |-P][-fi |-n][-pvX]源文件。。。目标目录
…当它点击“cp”命令时。实际上,脚本还有更多的功能,可以进一步处理复制的文件。使用“常规”文件名,例如“file.xml”,一切正常。只有带有空格或Unicode字符的文件才有问题。空格的问题表明引用不足。以下是不正确的:
someprogram $file
正确的版本如下:
someprogram "$file"
当$i为空时,请注意代码错误!
这可能是致命的rm-Rf错误造成的 有时候有比处理shell引用更简单的方法。在您的情况下,我将使用
find-print0
和xargs-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-{}
非常感谢。将代码更改为:cp“$i”/Volumes/Documents/SMSarchive/$dateVar/“$dateVar”—“$i”…效果非常好!甚至:
cp“$i”“/Volumes/Documents/SMSarchive/$dateVar/$dateVar-$i”
。在shell脚本中,始终引用变量,除非您有特定的理由不这样做。