ctmconv, zenity и имена файлов с пробелами
Я делаю небольшой скрипт преобразования в Zenity, но заметил, что ctmconv не разрешает пробелы в имени файла. Можно ли избавиться от пробелов во входном имени файла?
#!/bin/bash
cd ~/Desktop
file="$(zenity --title "3D Converter: Select a File to convert" --file-selection --file-filter=""*.ctm" "*.ply" "*.stl" "*.3ds" "*.dae" "*.obj" "*.lwo" "*.off"")"
filetype=$(zenity --list --title="Select File Type" --text="file types\ selection" --column="Select" --column="File Type" --radiolist false 3ds false ctm false dae false lwo false obj false off false ply true stl false wrl)
szSavePath="$(zenity --file-selection --filename="${file%%."${file##*.}"}"."$filetype" --save --confirm-overwrite)"
# szSavePath="$(zenity --file-selection --filename="out"."$filetype" --save --confirm-overwrite)"
ctmconv "$file" $szSavePath
zenity --info --text "Conversion Completed"
Приведенный выше скрипт получает файл для преобразования, а затем запрашивает тип файла для преобразования. Затем он заменяет исходный тип файла новым и передает результат в ctmconv. Вероятно, грязный способ сделать это, но эй, хо! Я новичок в этом.
ctmconv просто падает, если "$ file" равен "model rail", но хорошо, если это просто "model"
2 ответа
По какой-то очень странной причине, ctmconv
не распознает указанные в кавычках переменные как одну сущность, если их содержимое содержит пробелы. (Что также может стоить сообщать разработчикам об этом поведении как об ошибке).
Я предлагаю вам использовать любой инструмент для редактирования текста, например, sed
или же awk
вставить обратную косую черту перед пробелом. Например, что-то вроде этого.
$ echo "with space" | sed 's/\ /\\ /g'
with\ space
В случае вашей переменной, что-то вроде этого будет делать:
$ file="with space"
$ file="$( echo $file | sed 's/\ /\\ /g' )"
$ echo "$file"
with\ space
Я не могу научиться комментировать. Я не могу опубликовать код, так как он слишком длинный, я не могу его загрузить. Я не могу получить новую строку, поэтому я должен ответить на свой вопрос
#!/bin/bash
cd ~/Desktop
file="$(zenity --title "3D Converter: Select a File to convert" --file-selection --file-filter=""*.ctm" "*.ply" "*.stl" "*.3ds" "*.dae" "*.obj" "*.lwo" "*.off"")"
file="$( echo $file | sed 's/\ /\\ /g' )"
filetype=$(zenity --list --title="Select File Type" --text="file types\ selection" --column="Select" --column="File Type" --radiolist false 3ds false ctm false dae false lwo false obj false off false ply true stl false wrl)
szSavePath="$(zenity --file-selection --filename="${file%%."${file##*.}"}" --save --confirm-overwrite)"
echo ctmconv $file $szSavePath."$filetype"
ctmconv $file $szSavePath."$filetype"
zenity --info --text "Conversion Completed"`
Я просто поставил echo ctmconv и т. Д., Поэтому вам не нужен ctmconv, чтобы увидеть вывод, если вы выполняете в терминале..
ctmconv /home/alistair/Desktop/plastic/Buffers/Model\ Rail.stl /home/alistair/Desktop/Model\ Rail.3ds
Error: Invalid argument: /home/alistair/Desktop/Model\`
ctmconv падает, пытаясь вывести файл: ввод принят.
Но если я копирую, вставляю и выполняю строку "echo", она работает отлично....
Что если бы я мог просто удалить пробелы из szSaveFile. Можно ли это сделать?