2016-03-19 5 views
0

У меня есть этот скриптBash - ошибка сценария, если папка с пробелами

#!/bin/bash 

rename_files() { 
    title="${1##*${2} - }" 
    for filename in "$1/"*.*; do 
    case "${filename##*.}" in 
    doc|doc|doc) 
     mkdir -p -m 777 "/Users/Desktop/Documents Share/Downloaded/${title}" 
     new_path="/Users/Desktop/Documents Share/Downloaded/${title}/${title}.${filename##*.}" 
     let "iters=1" 
     while [ -f $new_path ] ; do 
      new_path=$new_path"$iters" 
      let "iters++" 
     done 
     echo "moving $filename -> $new_path" 
     mv "${filename}" "${new_path}" 
     ;; 
    esac 
    done 
} 

rename_category() { 
    for path in "/Users/Desktop/Documents Share/Downloads/${1}"*; do 
    rename_files "$path" "$1" 
    done 
} 

rename_category DOC 

Этот скрипт автоматически перемещает и переименовывает файлы, содержащиеся в /Users/Desktop/Documents Share/Downloaded. Все работает нормально, если я использую папку с именем Documents вместо Documents Share. Я попытался использовать Documents\ Share, но он не работает.

Здесь регистрирует ошибка

/Users/Desktop/Script.sh: line 11: [: /Users/Desktop/Documents: binary operator expected 

Как я могу решить эту проблему?

+0

'case '$ {filename ## *.}" В doc | doc | doc) '?? WTH? Удачи. – shellter

+0

Только пример расширения. – DylanDog

ответ

1

Перечислите переменные всюду. Двойные кавычки отсутствуют в указанной строке:

while [ -f $new_path ] ; do 

shoudl быть

while [ -f "$new_path" ] ; do 
+0

Большое спасибо! Теперь он работает! – DylanDog

1

Я думаю, что $ new_path (строка 11) должны быть заключены в двойные кавычки.

+0

Большое спасибо! Ваш ответ помог мне, но хороба ответил за несколько минут до вас; Мне очень жаль, что я не могу отметить лучший ответ более чем на один ответ. – DylanDog

+0

Да, я знаю. Не волнуйся, я рад, что был полезен. Возможно в следующий раз – Process0