【问题标题】:How can I copy files with names containing spaces and UNICODE, when using a shell script?使用 shell 脚本时,如何复制名称包含空格和 UNICODE 的文件?
【发布时间】:2011-02-02 19:04:02
【问题描述】:

我有一个文件列表,我试图在 bash shell 脚本中复制和移动(使用 cp 和 mv)。我遇到的问题是,我无法让任一命令识别大量文件,这似乎是因为文件名包含空格和/或 unicode 字符。我找不到任何开关来解码/重新编码这些字符。相反,例如,如果我复制“文件名.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 字符的文件才有问题。

【问题讨论】:

    标签: bash shell unicode file scripting


    【解决方案1】:

    空格问题表明引用不足。以下不正确:

    someprogram $file
    

    正确的版本如下:

    someprogram "$file"
    

    【讨论】:

    • 谢谢!将代码更改为: cp "$i" /Volumes/Documents/SMSarchive/$dateVar/"$dateVar"-"$i" ...完美运行!
    • 甚至:cp "$i" "/Volumes/Documents/SMSarchive/$dateVar/$dateVar-$i"。在 shell 脚本中,总是引用变量,除非你有特定的理由不这样做。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有时有比处理 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-{}
      

      【讨论】:

        猜你喜欢
        • 2012-09-30
        • 2012-10-21
        • 2013-03-08
        • 2010-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多