2010-03-31 29 views
5

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

EDIT(添加当前代码): 当我运行:

的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字符的文件,我遇到问题。

回答

16

空格问题表示引用不足已完成。下列哪项不正确:

someprogram $file 

正确的版本如下:

someprogram "$file" 
+0

谢谢!将代码更改为: cp“$ i”/ Volumes/Documents/SMSarchive/$ dateVar /“$ dateVar” - “$ i” ...完美运作! – LOlliffe 2010-03-31 06:28:18

+1

或甚至:'cp“$ i”“/ Volumes/Documents/SMSarchive/$ dateVar/$ dateVar- $ i”'。在一个shell脚本中,*总是*引用变量,除非你有一个特定的原因。 – 2010-03-31 11:54:52

1

注意代码中的错误,当$ I为空! 这可能是致命的rm -Rf错误的结果!

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-{} 
相关问题