OSX Bash Script работает с файлами / папками с пробелами в имени - PullRequest
2 голосов
/ 30 ноября 2011

Я пытаюсь создать скрипт BASH на OS X (10.6 / 10.7) для обработки папки с именем 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, поэтому они не выполняются ... проблема одинакова как для создания папок, так и для копирования имен файлов.

Если я скопирую и вставлю «echo'd» версию этих команд в окно терминала, команды будут работать! Но когда BASH выполняет их, он не уважает. (

Есть идеи?

Спасибо !! John

1 Ответ

1 голос
/ 30 ноября 2011

Смотрите мои модификации в вашем скрипте, вам не нужно заменять пробелы, как вы пытались.Кроме того, вы должны выбрать, следует ли использовать обратную косую черту в пробелах или вы используете кавычки.Самый простой способ - использовать двойные кавычки.Хороший документ о кавычках, см. http://mywiki.wooledge.org/Quotes и http://wiki.bash -hackers.org / синтаксис / слова

#!/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"
...