Отправляет email-рассылки с помощью сервиса Sendsay

Проблема с BASH-скриптом и файлами с пробелами в именах

Здравствуйте!

Нужно получить файла вот такого примерно вида:

File1=/somedir/somefile1
File2=/somedir/somefile2
...

Пытаюсь сделать вот так:

dir="/mnt/d/Music/Down Low"
count=0
for i in "$( find "$dir" -iname "*.mp3" -o -iname "*.ogg" )"; do
let "count = $count + 1"
echo $count
echo "$i" >> "tmp_file"
done

Получается фигово:

$ cat /tmp/tmp_file
File1=/mnt/d/Music/Down Low/Down Low - Vision Of Life.ogg
/mnt/d/Music/Down Low/Down Low - Moonlight.mp3
/mnt/d/Music/Down Low/Down Low - Key To Your Heart.ogg
/mnt/d/Music/Down Low/Down Low - Thank You.mp3
/mnt/d/Music/Down Low/Down low - Once upon a time.mp3
/mnt/d/Music/Down Low/Down Low - Johny B.ogg
/mnt/d/Music/Down Low/Down Low - La Serenissima.ogg

Т.е. оно весь вывод find обрабатывает целиком. Если убрать кавычки вокруг
find (вот так: $( find "$dir" -iname "*.mp3" -o -iname "*.ogg" ) ), то оно
разбивает строку по пробелам. Перепробовал уже кучу вариантов, кавычки ставил

по-всякому - не выходит.
Как такое сделать?

Спасибо за ответы-советы.

Ответить   Sat, 10 Dec 2005 03:54:41 +1000 (#487422)

 

Ответы:

Здравствуйте 9A4172.
Скрипт получился не очень красивый, но вреде работает.

#!/bin/sh
dir="/home/d3rp/music"
count=0
find $dir -iname "*.mp3" -o -iname "*.ogg" > listn
sed 's/ /|/g' listn > listm
for i in $(cat listm); do
count=$(($count+1))
echo $count
echo "File$count=$i" >> "tmp_file1"
done
sed 's/|/ /g' tmp_file1 > tmp_file
rm -rf tmp_file1 listn listm

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23078; Возраст листа: 868; Участников: 1472
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/487465

Ответить   Trubachev Andrew Fri, 9 Dec 2005 23:31:49 +0000 (#487465)

 

В сообщении от Суббота 10 Декабрь 2005 09:31 Trubachev Andrew написал(a):

Большое спасибо, работает! Я бы до такого не додумался :)

Тут вот можно использовать sed -i, поэтому listm не нужен

Если вдруг кому интересно, вся эта фигня нужна была для автоматической
генерации плейлистов для mpfc (консольный аудиоплейер).

Ответить   Sun, 11 Dec 2005 12:33:26 +1000 (#487980)

 

В сообщении от 9 декабря 2005 20:54 9A4172 написал(a):

find ... | while read i
do
# $i содержит строку
...
done

Ответить   "Sergey B. Khvatov" Sat, 10 Dec 2005 11:45:27 +0300 (#487593)

 

В сообщении от Суббота 10 Декабрь 2005 18:45 Sergey B. Khvatov написал(a):

Большое спасибо, работает! И даже идеологически правильнее, чем способ
Андрея Трубачева :)
Попробовал расширить и углубить:

#! /bin/bash

file="$1"
if [ -e "$file" ]; then
rm "$file"
fi
shift

tmp_file="/tmp/mpfc_tmp"
if [ -e "$tmp_file" ]; then
rm -f "$tmp_file"
fi

count=0
while [ $# -gt 0 ]; do
dir="$1"
find "$dir" -iname "*.mp3" -o -iname "*.ogg" | while read i
do
count=$(($count+1))
echo "File$count=$i" >> "$tmp_file"
done
shift
done

echo "[playlist]" >> "$file"
echo ""numberofentries=$( wc -l "$tmp_file" | cut -f 1 -d ' ' )"" >> "$file"
cat "$tmp_file" >> "$file"
rm "$tmp_file"

exit 0
Dызывается примерно так: make_mpfc_pls ~/some.pls /mnt/d/Music/Down\
Low/ /mnt/d/Music/C-Block/
Проблема в том, что счетчик count обнуляется для каждого нового параметра
командной строки (т.е. каталога). Почему так происходит? Из-за этого же
используется дурацкая строчка с wc и cut: после завершения цикла count=0.

Ответить   Sun, 11 Dec 2005 13:18:40 +1000 (#487981)

 

Извините, но это опять я :)
Ни у кого никаких мыслей? Почему же счетчик обнуляется после завершения
цикла?

Ответить   Wed, 14 Dec 2005 19:07:06 +1000 (#489686)

 

Читаем внимательно "Advanced Bash-Scripting Guide"
http://gazette.lrn.ru/rus/articles/abs-guide/

"... Сценарий может экспортировать переменные только дочернему процессу, т.е.
командам и процессам запускаемым из данного сценария. Сценарий, запускаемый из
командной строки не может экспортировать переменные "на верх" командной оболочке.
Дочерний процесс не может экспортировать переменные родительскому процессу."

"...Конвейер исполняется в дочернем процессе, а посему -- не имеет доступа к
переменным сценария."

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23118; Возраст листа: 873; Участников: 1472
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/489710

Ответить   Wed, 14 Dec 2005 13:11:25 +0300 (#489710)

 

В сообщении от Среда 14 Декабрь 2005 20:11 Michael Krylov написал(a):

Спасибо, я как-то о таком не подумал, уж очень это непривычно...
И что же делать? В файл этот счетчик сохранять?

Ответить   Thu, 15 Dec 2005 19:13:25 +1000 (#490248)

 

9A4172 пишет:

а может export в окружение как нить поможет

Ответить   "Nick S. Groznyh" Thu, 15 Dec 2005 15:02:19 +0400 (#490291)

 

В сообщении от Четверг 15 Декабрь 2005 21:02 Nick S. Groznyh написал(a):

Большое спасибо, так работает! Тема закрыта. Буду изучать Perl :)

Ответить   Fri, 16 Dec 2005 23:04:14 +1000 (#490733)

 

9A4172 пишет:

Лучше Python, он проще в понимании.

Ответить   Oleg Ponomarev Fri, 16 Dec 2005 15:38:50 +0200 (#490752)

 

В сообщении от Пятница 16 Декабрь 2005 23:38 Oleg Ponomarev написал(a):

Слегка приоткрываю тему :)
Может быть, он и понятнее (для меня, из языков программирования знающего
только Pascal/Delphi, да и то, кое-как, синтаксис Perl просто ужасен). Опять

же, объектно-ориентированный, но ... Мой опыт работы с Python, как
пользователя - сугубо отрицательный. Согласно этому самому опыту,
вероятность, что некая более-менее сложная программа, написанная на Питоне,
заработает на конкретно моей системе не превышает 50% :)
Вроде бы интерпретируемый кроссплатформенный язык, но запускаешь
какой-нибудь some.py - и на консоль вываливается куча сообщений о
синтаксических ошибках...
Впрочем, это мое сугубо личное мнение, сложившееся на основе моего сугубо
личного опыта :)

Ответить   Sat, 17 Dec 2005 21:17:53 +1000 (#491065)

 

В сообщении от 1134847073 секунд после начала Эпохи 9A4172 написал(а):

Ну если это синтаксические ошибки, то это вина исключительно
разработчиков этой программы.

А мой опыт показывает что, синтаксические ошибки возникают крайне
редко. Чаще всего возникают исключения, никак несвязанные с
синтаксисом, а связанные чаще с несовместимостью программы и библиотек.
То что на C просто не компилируется, на Python заканчивается аварийным
завершением в результате необработанного исключения. К стати, в Perl
такие ошибки отслеживаються намного сложнее, а проявляются в виде
глюков программы. Однако, в Perl очень удобно работать с текстом, по
этому я его использую в некоторых программах. То, какой язык лучше
учить определяется еще и областью его применений. Если вы системный
администратор и хотите изучить язык для автоматизации каких либо
настроек и т.п., то, мне кажется, что Perl вам подойдет больше. А если
вы хотите строить GUI-программы, то Python. И, как уже говорили, Python
более прост в изучении.

Ответить   Konstantin Korikov Sun, 18 Dec 2005 08:47:53 +0200 (#491264)

 

Вроде же есть Perl-Tk , это сложнее?

Ответить   Sun, 18 Dec 2005 13:58:18 +0600 (#491278)

 

On Sun, 18 Dec 2005 13:58:18 +0600
Alexei Shilin wrote:

Это Tk, а Python умеет работать с gtk (и кажется с qt тоже) безо всяких
там tk.

Ответить   Sun, 18 Dec 2005 21:08:13 +0300 (#491892)

 

В сообщении от 1134932893 секунд после начала Эпохи Vladimir Rusinov написал(а):

Дык, и Perl умеет с GTK работать, и Python с Tk. Но суть в том что на
Python программы с графическим интерфейсом писать удобнее (мне по
крайней мере).

Ответить   Konstantin Korikov Tue, 20 Dec 2005 02:58:12 +0200 (#492472)

 

А чем текст редактируете? Куча синтаксических ошибок может быить
следствием того, что редактор подставляет где пробелы, где -
табуляцию. А синтаксис питона, как известно, основан на индентации
(как это по-русска...). Поэтому отключите в редакторе знаки табуляции
вовсе, или используйте настройку "сколько пробелов вставлять вместо
tab"

Perl хорош, когда им постоянно пользуешься :(
Мне приходилось перл учить раза 3 - и каждый раз забывался напрочь, до
тла! А питон не забывается, даже когда долго не пользуешься -
логичней наверное. Ну и объекты, конечно - в перле это просто кошмар,
уродство (IMHO, как говорится). Вроде как DLL в Windows по сравнению с
so в *nix. И запомнить это невозможно - как когда-то (кто знает -
посмеётся) копировали карты с операторами JCL - только настоящий гуру
знал, что они значат.

--
Vladimir A.Efremov, PhD
Pangea Inc., Voice: (095) 912-10-23, 912-65-03
Fax: (095) 912-63-44 E-mail: vefrem***@g*****.com
ICQ: 259496450

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23206; Возраст листа: 881; Участников: 1478
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/493100

Ответить   Thu, 22 Dec 2005 19:14:45 +0300 (#493100)

 

Здесь не соглашусь - ибо знаю множество сложного кросплатформенного софта написанного
на пайтоне. Хотя часто пакеты с этим софтом собирают под определнную платформу,
но связано это скорее с отсутсвием контроля (или с разной реализацией) зависимостей
на разных платформах.

Ну возмите хороший редактор или IDE для пайтона - и попробуйте писать в нем.
Получите все прелести объектно ориентированного программирования и продуманной
структуры программ на пайтоне (автодополнение, подсказки, свертывание, браузер
классов итд итп)

^^^^^^^^^^^^^^^^^^ Отступы может?

IMHO пайтон все-же более продуманный язык. И изучать его вовсе не сложно, и его
объектная модель - проста и понятна. Рекомендую.

Дамир

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23209; Возраст листа: 882; Участников: 1478
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/493249

Ответить   Fri, 23 Dec 2005 08:50:39 +0300 (#493249)

 

On Thu, 22 Dec 2005 19:14:45 +0300
Vladimir Efremov <vefrem***@g*****.com> wrote:

Согласен, Володя, на все 100 - недавно пришлось влезть в ПИТОШУ после
более чем годичного програмамирования на С++ - и ничего, разобрался.
Про перловку такого сказать не могу - мои многочисленные попытки
понять этот, с позволения сказать, язык программирования, закончились
крахом.

А вот это слово лучше не использовать (даже в адрес УЖАСНОГО ПЕРЛА
!!!) - нам и без него зла хватает.

Да нет, JCL довольно логичный язык (хотя его многие злые языки -
конкуренты IBM - называли птичьим). В чем-то он похож на
объектно-ориентированный - тот же принцип порождения объектов (типа
задания, шага задания и объекта данных), те же свойства, та же
инкапсуляция (с помощью процедур). Кто работал на ЕС ЭВМ, тот поймет,
о чем я...

С уважением -
Андрей Соловьев

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 23311; Возраст листа: 890; Участников: 1474
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/495913

Ответить   Sat, 31 Dec 2005 10:37:23 +0300 (#495913)