Скрипт на bash: открытие файла с именем, содержащим пробелы

Как правильно задавать вопросы Правильно сформулированный вопрос и его грамотное оформление способствует высокой вероятности получения достаточно содержательного и по существу ответа. Общая рекомендация по составлению тем: 1. Для начала воспользуйтесь поиском форума. 2. Укажите версию ОС вместе с разрядностью. Пример: LM 19.3 x64, LM Sarah x32 3. DE. Если вопрос касается двух, то через запятую. (xfce, KDE, cinnamon, mate) 4. Какое железо. (достаточно вывод inxi -Fxz в спойлере (как пользоваться спойлером смотрим здесь)) или же дать ссылку на hw-probe 5. Суть. Желательно с выводом консоли, логами. 6. Скрин. Просьба указывать 2, 3 и 4 независимо от того, имеет ли это отношение к вопросу или нет. Так же не забываем об общих правилах Как пример вот
Аватара пользователя

Автор темы
madesta
Сообщения: 1988
Зарегистрирован: 11 июн 2017, 21:47
Решено: 28
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 425 раз
Контактная информация:

Скрипт на bash: открытие файла с именем, содержащим пробелы

#1

22 мар 2019, 01:51

Немного длинное вступление, но нужное для понимания "хотелки".

Осуществляется переписка в виде обмена файлами odt. Имеющиеся отредактированные файлы, содержащие послание, отправляются раз в 30 минут.

Для открытия файла на редактирование запускается скрипт sh, который должен сделать:

- скопировать шаблон сообщения с именем Message.odt;

- запросить назначение файлу нового имени и в соответствии с этим переименовать скопированный файл Message.odt;

- сформировать список файлов, время последнего изменения которых не превышает 1 минуты. Практически это всегда 1 файл;

- так как в сформированном списке сначала присутствует указание пути к папке, а имя файла с указанием его пути задаётся второй строкой, то первую строку из файла необходимо удалить;

- прочитать полученный список и записать это значение в переменную (имеется ввиду имя файла с указанием его пути);

- выполнить xdg-open с переменной, которая была только что создана.

В результате получилось следующее:

Код: Выделить всё

#!/bin/bash
sm=$HOME/.scripts/Message.odt
dm=$HOME/Exchange/ForS
temp=$HOME/.scripts
cp $sm $dm
mv $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
find $dm -mmin -1 > $temp/created.txt
perl -ni -e 'print unless $. == 1' $temp/created.txt
var=`cat $temp/created.txt | awk '{print $NF}'`
xdg-open $var
exit
Проблема состоит в том, что всё работает, если имя файла содержит только 1 слово. Если имя составное, то есть содержит пробелы, то xdg-open $var не может быть выполнено вследствие того, что пытается открыть, например, не $HOME/Exchange/ForS/Файл отчёта.odt, а $HOME/Exchange/ForS/отчёта.odt.
Попытка закавычить $var, то есть сделать xdg-open "$var" к желаемому результату не приводит.

Может быть кто знает волшебный способ заставить описанное выше работать с именами файлов, содержащих пробелы?

Решение rogoznik » 22 мар 2019, 06:29
madesta писал(а):
22 мар 2019, 01:51
cp $sm $dm
mv $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
А не проще заменить на одну строку с копированием

Код: Выделить всё

cp $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
madesta писал(а):
22 мар 2019, 01:51
Попытка закавычить $var, то есть сделать xdg-open "$var" к желаемому результату не приводит.
Потому что твоя конструкция
madesta писал(а):
22 мар 2019, 01:51
var=`cat $temp/created.txt | awk '{print $NF}'`
Возвращает тебе не то что ты ожидаешь.
Если строка, содержащая путь к файлу, первая то сделай так

Код: Выделить всё

read var < $temp/created.txt
xdg-open "$var"
Peek 2019-03-22 08-28.gif

Перейти к ответу ➙

Аватара пользователя

FreeStyler
Сообщения: 795
Зарегистрирован: 23 июл 2018, 07:58
Решено: 6
Откуда: Сиб
Благодарил (а): 756 раз
Поблагодарили: 94 раза
Контактная информация:

Скрипт на bash: открытие файла с именем, содержащим пробелы

#2

22 мар 2019, 05:24

Скорее всего где-то нужно поставить кавычки, одинарные или двойные...
deadmau5 - Harmonic Mix
■ KDE Neon 22.04 (UE) @ Lenovo IdeaPad 3-15 Ryzen 5 4500U, 18 Гб DDR-4, 128 Gb SSD +1 Gb SSD 1920x1080

Аватара пользователя

rogoznik
Сообщения: 10014
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

Скрипт на bash: открытие файла с именем, содержащим пробелы

#3

22 мар 2019, 06:29

madesta писал(а):
22 мар 2019, 01:51
cp $sm $dm
mv $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
А не проще заменить на одну строку с копированием

Код: Выделить всё

cp $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
madesta писал(а):
22 мар 2019, 01:51
Попытка закавычить $var, то есть сделать xdg-open "$var" к желаемому результату не приводит.
Потому что твоя конструкция
madesta писал(а):
22 мар 2019, 01:51
var=`cat $temp/created.txt | awk '{print $NF}'`
Возвращает тебе не то что ты ожидаешь.
Если строка, содержащая путь к файлу, первая то сделай так

Код: Выделить всё

read var < $temp/created.txt
xdg-open "$var"
Peek 2019-03-22 08-28.gif
ИзображениеИзображение

Аватара пользователя

Автор темы
madesta
Сообщения: 1988
Зарегистрирован: 11 июн 2017, 21:47
Решено: 28
Откуда: BY
Благодарил (а): 79 раз
Поблагодарили: 425 раз
Контактная информация:

Скрипт на bash: открытие файла с именем, содержащим пробелы

#4

22 мар 2019, 15:22

darkfenix писал(а):
22 мар 2019, 06:29
А не проще заменить на одну строку с копированием

Код: Выделить всё

cp $dm/Message.odt $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt
Понимаю, что так проще, но при проверке не сработало (не иначе - шайтан какой-то :blink2: ).
Файл odt в выходной папке не появился, $temp/created.txt не содержал данных.

В дальнейшем при внимательном рассмотрении услышал сам от себя много нового и интересного, особенно по поводу своей интеллектуальной характеристики :-D . Правильная строка должна быть:

cp $sm $dm/"`zenity --entry --title="Имя файла" --text="Назначьте имя создаваемому файлу"`".odt

В самом начале задавалось sm=$HOME/.scripts/Message.odt, поэтому $sm/Message.odt умный компьютер не понимает.

Аватара пользователя

rogoznik
Сообщения: 10014
Зарегистрирован: 27 июн 2017, 13:36
Решено: 128
Откуда: Нижний Тагил
Благодарил (а): 776 раз
Поблагодарили: 1950 раз
Контактная информация:

Скрипт на bash: открытие файла с именем, содержащим пробелы

#5

22 мар 2019, 19:52

madesta писал(а):
22 мар 2019, 15:22
В дальнейшем при внимательном рассмотрении услышал сам от себя много нового и интересного, особенно по поводу своей интеллектуальной характеристики
Самокритика это хорошо :-D
ИзображениеИзображение

Закрыто

Вернуться в «Программирование, скриптинг, виртуализация»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 4 гостя