Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用shell脚本时,如何复制名称包含空格和UNICODE的文件?_Bash_Shell_Unicode_File_Scripting - Fatal编程技术网

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

Bash 使用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=

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

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

MacBookPro:Desktop$./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]源文件目标文件 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脚本中,始终引用变量,除非您有特定的理由不这样做。