【问题标题】:OSX Bash Script working with Files/Folders with spaces in the nameOSX Bash 脚本使用名称中带有空格的文件/文件夹
【发布时间】:2011-11-30 03:58:36
【问题描述】:

我正在尝试在 OS X (10.6/10.7) 上构建一个 BASH 脚本来处理一个名为 QCExports 的文件夹,该文件夹中包含人名的文件夹,格式为“LAST,First”,即“BOND,James”。

当我运行以下脚本时,一切正常,但它落在文件夹或文件名上,其中包含空格。

脚本代码:

#!/bin/bash
echo "QuickCeph Export Script"

#Set Path to Process & Paths to Copy To
pathToQCExports=/Users/myuser/Desktop/QCExports
sureSmilePath=/Users/myuser/Desktop/QCExportsForSureSmile
sesamePath=/Users/myuser/Desktop/QCExportsForSesame
blankReplace=""

#Process Each Name
find $pathToQCExports -type d | while read name ; do

    #escaping the folder with a space in the name
nameParsed=${name/", "/",\ "}

    echo "Processing: "$nameParsed  
    pathSureSmile=${nameParsed/$pathToQCExports/$sureSmilePath}
    pathSesame=${nameParsed/$pathToQCExports/$sesamePath}
    mkdir $pathSesame
    mkdir $pathSureSmile

    echo "Folders Created"

    #Copy For SureSmile 
    echo ${pathSureSmile}"/Suresmile-Frontal\ Photo.jpg" ${pathSureSmile}"/Suresmile-Frontal\ Photo.jpg"
    #cp `${$pathSureSmile}"/Suresmile-Frontal\ Photo.jpg" ${pathSureSmile}"/Suresmile-Frontal\ Photo.jpg"`

    #Copy For Sesame
    echo ${pathSesame}"/Suresmile-Frontal\ Photo.jpg" ${pathSesame}"/S02.jpg"
    #cp `${pathSesame}"/Suresmile-Frontal\ Photo.jpg" ${pathSesame}"/S02.jpg"`

done

echo "Completed";

输出:

QuickCeph Export Script
Processing: /Users/myuser/Desktop/QCExports/BOND,\ James
mkdir /Users/myuser/Desktop/QCExportsForSesame/BOND,\ James
mkdir: James: File exists
mkdir /Users/myuser/Desktop/QCExportsForSureSmile/BOND,\ James
mkdir: James: File exists
Folders Created
/Users/myuser/Desktop/QCExportsForSureSmile/BOND,\ James/Suresmile-Frontal\ Photo.jpg /Users/myuser/Desktop/QCExportsForSureSmile/BOND,\ James/Suresmile-Frontal\ Photo.jpg
/Users/myuser/Desktop/QCExportsForSesame/BOND,\ James/Suresmile-Frontal\ Photo.jpg /Users/myuser/Desktop/QCExportsForSesame/BOND,\ James/S02.jpg
Completed

在 OS X 上,通常在终端中,您使用 \ 来转义文件夹或文件名中的空格,但这似乎不起作用。

我注意到它将空格解释为普通空格将在命令行上解释并认为我想在两个文件上执行命令 - 即它没有传递 \ 向前。我最终在执行脚本的文件夹中有一个名为“Bond,\”的文件夹和一个名为“James”的文件夹。

注意,我现在故意将 cp 命令 # 输出,所以它们没有被执行……创建文件夹和复制文件名的问题都是一样的。

如果我将这些命令的“回显”版本复制并粘贴到终端窗口中,这些命令就会起作用!但是当 BASH 执行它们时,它不尊重 . :(

有什么想法吗?

谢谢!! 约翰

【问题讨论】:

    标签: macos bash spaces


    【解决方案1】:

    查看我对脚本的修改,您不必像尝试的那样替换空格。 此外,您必须选择是反斜杠还是使用引号。 简单的方法是使用双引号。 关于报价的好文档,请参阅 http://mywiki.wooledge.org/Quotes 和 http://wiki.bash-hackers.org/syntax/words

    #!/bin/bash
    echo "QuickCeph Export Script"
    
    #Set Path to Process & Paths to Copy To
    pathToQCExports=/Users/myuser/Desktop/QCExports
    sureSmilePath=/Users/myuser/Desktop/QCExportsForSureSmile
    sesamePath=/Users/myuser/Desktop/QCExportsForSesame
    blankReplace=""
    
    #Process Each Name
    find $pathToQCExports -type d | while read nameParsed ; do
    
        echo "Processing: $nameParsed"
        pathSureSmile="${nameParsed/$pathToQCExports/$sureSmilePath}"
        pathSesame="${nameParsed/$pathToQCExports/$sesamePath}"
        mkdir "$pathSesame"
        mkdir "$pathSureSmile"
    
        echo "Folders Created"
    
        #Copy For SureSmile 
        echo "${pathSureSmile}/Suresmile-Frontal Photo.jpg" "${pathSureSmile}/Suresmile-Frontal Photo.jpg"
    
        #Copy For Sesame
        echo "${pathSesame}/Suresmile-Frontal Photo.jpg" "${pathSesame}/S02.jpg"
    
    done
    
    echo "Completed"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-08
      • 2021-12-26
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      相关资源
      最近更新 更多