我有一个文件列表,我试图在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字符的文件,我遇到了问题。
答案 0 :(得分:17)
空格问题表明报价不足。以下是不正确的:
someprogram $file
正确的版本如下:
someprogram "$file"
答案 1 :(得分:1)
当$ i为null时,请注意代码错误! 这可能是致命的rm -Rf错误的结果!
答案 2 :(得分:0)
有时比处理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-{}