LINUX.ORG.RU

Простой диалог копирования файлов

 ,


1

2

Доброго времени суток.

Соответсвенно, есть небольшой диалог выбора файлов:

COPY=`"yad  --center --width=600 --height=350   --file-selection --multiple --separator=" " --text="Копировать файлы"`"

cp -a $"{COPY}" /path/to/folder

При выборе нескольких файлов переменной COPY будет присвоено значение /path/to/file1 /path/to/file2 и т.д., но если в именах выбираемых файлов будут пробелы, то копировать их уже не удастся.

Что делать? Каким-то образом изменить разделитель в cp(если это возможно, то как?). Поставить для yad другой разделитель(например, точку с запятой) и какую-нибудь регулярку, которая поставит перед всеми пробелами \, после чего все ; заменит на пробелы?

Или есть более грамотное решение?

Что такое yad?

Можно сделать разделитель ноль («\0000»), а потом скармливать xarg -0 cp -t /path/to/folder

ziemin ★★ ()

есть более грамотное решение?

qt, python

anonymous ()

Нулевой символ как уже говорил товарищ выше.

Каким-то образом изменить разделитель в cp(если это возможно, то как?)

полюбопытствуй на тему IFS в баше.

antares0 ★★★ ()
Последнее исправление: antares0 (всего исправлений: 1)
Ответ на: комментарий от ziemin
 yad  --center --width=600 --height=350   --file-selection --multiple --separator="\0000" --text="Копировать файлы" | xargs -0 cp -t tmp/ 

Ииии... получаем

 cp: не удалось выполнить stat для «/path to/file\n»: Нет такого файла или каталога 
raven_cler ★★ ()
Ответ на: комментарий от antares0

полюбопытствуй на тему IFS в баше.

Да, не упомянул. Внутри функции «подмена» IFC почему-то работать отказалась.

raven_cler ★★ ()
Ответ на: комментарий от raven_cler

Ты прям в боевом режиме запустил :) У меня же нет этого yad'а. Откуда я знаю, может он ноль как разделитель использовать или нет.

А вообще, похоже он сам разделяет свой вывод на строки. Убери -0 (и попробуй сначала echo вместо cp)

Или покажи кусок его вывода

ziemin ★★ ()
Последнее исправление: ziemin (всего исправлений: 1)
FILES=($(yad --file --quoted-output --multiple --separator=" "))
cp -f ${FILES[@]} /path/to/folder

--quoted-output я добавил только в последних версиях, так что посмотри, какая у тебя, может надо обновиться

ananas ★★★★★ ()
Ответ на: комментарий от ziemin

Откуда я знаю, может он ноль как разделитель использовать или нет.

не может. надо бы поправить

ananas ★★★★★ ()
Ответ на: комментарий от raven_cler

не удалось выполнить stat для «/path to/file\n»: Нет такого файла или каталога

в конце вывода в любом случае будет перевод строки. если ты используешь \0 как разделитель, убирай его sed-ом перед скармливанием xargs-у

ananas ★★★★★ ()
Ответ на: комментарий от MKuznetsov

Исходник этого интерфейса тоже впечатляет. Видеть define в bash-скриптах приходится нечасто.

Мешает его избыточность для простых задач. А там ХЗ.

raven_cler ★★ ()
Ответ на: комментарий от ziemin

Вывод будет просто имена файлов через пробел. В случае с --separator=«\0000» даже без пробелов.

Убрать -0 не помогло.

raven_cler ★★ ()
Ответ на: комментарий от ananas

Ух ты, не знал, что разработчик этой штуки мало того, что русскоязычный, так ещё и обитает на ЛОРе.

По-поводу варианта: увы, не работает.

Значение выводит в одинарных кавычках, но в массив вносится всё равно через пробел.

raven_cler ★★ ()

Пока сделал так:

GUI="`yad --file --multiple --separator=";"`"
LIMIT="`echo $GUI | sed "s/[^;]//g" | wc -c`"
i=0
while [ "$i" -lt "$LIMIT" ] ; do 
    i=$(($i+1)) 
    ARR[$i]="`echo $GUI | awk -F';' '{printf $'$i'}'`"
done
cp "${ARR[@]}" tmp/

Какая-то черная магия для столь простой задачи, но ничего лучше не придумалось.

raven_cler ★★ ()
Ответ на: комментарий от raven_cler
FILES=($(yad --file --quoted-output --multiple --separator=" "))
eval cp -f ${FILES[@]} /path/to/folder
ananas ★★★★★ ()
Ответ на: комментарий от raven_cler

Исходник этого интерфейса тоже впечатляет

львиная часть исходника - «закат солнца вручную» то есть создание интерфейса, которое по хорошему заменяется рисованием в glade.

Мешает его избыточность для простых задач. А там ХЗ.

в вашем случае из всего gtk достаточно дёрнуть стандартный диалог. И imho GUI в bash-скрипте само по себе избыточно (или неверно выбран инструмент - должен быть не bash)

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

или неверно выбран инструмент - должен быть не bash

это пуркуа?

ananas ★★★★★ ()
Ответ на: комментарий от ananas

это пуркуа?

если понадобился GUI интерактив - то любой скриптовый язык в котором это делается проще. python,ruby на вкус и цвет.

на tcl/tk то что делает ТС (запрос кучки файлов и копирование в каталог) выглядит примерно так :

package require Tk
withdraw .
set filelist [ tk_getOpenFile -multiple yes ]
if { $filelist != {} } {
  file copy -force {*}$filelist $destDir
}

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

или неверно выбран инструмент - должен быть не bash

Может, и правда так. Но пусть будет как будет, ага.

любой скриптовый язык в котором это делается проще

И в итоге всё равно длинней, чем вариант ananas.

Хотя да, так-тикль может подойдёт и лучше(не знаю, надо помучать на досуге книгу какую что ли). А вот в каком-нибудь Python(если учесть, что задач на деле больше, чем одна указанная, просто тут возникла непонятка) со всеми этими massedit, subprocess.Popen и т.д. уже как-то не комильфо.

И, опять же, проще — понятие относительное. Проще всегда будет тот инструмент, который чаще пользуешь => лучше знаешь.

raven_cler ★★ ()
Ответ на: комментарий от raven_cler

subprocess.Popen и т.д. уже как-то не комильфо.

Почему? А в bash как это происходит, по твоему? Просто синтаксический сахар и обычный блокирующий вызов (зачастую).

Chaser_Andrey ★★★★★ ()
Ответ на: комментарий от Chaser_Andrey

Почему?

Банально дольше писать.

Всё просто. Можно, конечно, настроить какой-нибудь автокомплит и т.д., но с этим тоже нужно отдельно разбираться.

raven_cler ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.