Если вы поместите имена файлов между отметками, экранирование символов с обратной косой чертой не будет работать. Хотя есть и другой способ сделать это. Вот функция цитаты, которую я использовал в прошлом, которая может быть полезна для вас.
# # Quote a string, wrapping it in tick marks ('), and escaping any # embedded ticks. # # Inputs: # $1: The string to quote # # Returns: # (stdout) - The quoted string # quote() { if [ $(echo "$@" | tr -d "\n" | wc -c) -eq 0 ]; then echo "''" elif [ $(echo "$@" | tr -d "[a-z][A-Z][0-9]:,.=~_/\n-" | wc -c) -gt 0 ]; then echo "$@" | sed -e "s/'/\'\"\'\"\'/g" | sed -e "s/^/'/g" -e "s/$/'/g" else echo "$@" fi }
Когда вы запускаете его, вы получаете такие результаты.
$ quote abc abc $ quote "abc'def" 'abc'"'"'def' $ quote \"abc\" '"abc"' $ quote "abc def" 'abc def'
Идея в том, что вы можете заменить последний printf в вашем скрипте следующим образом:
printf "mv %s %s\n" "$(quote "$filename")" "$(quote "$ohne")"
Используя имя файла abc'def с вашим скриптом с указанным выше изменением, я получил это в качестве вывода.
mv 'abc'"'"'def' abcdef
и успешно переименовал файл при выполнении.