Задача такая — надо пробежаться по директориям, включая поддиректории, и выполнить там некоторые действия
типа
id3v2 -C *.mp3
java -jar id3iconv-0.2.1.jar -e utf8 .mp3
Проблема заключается в нескольких пунктах
1. Названия директорий содержат пробелы. Таким образом для
./script.sh '/home/dmitriid/old data/Data Big/Mamut/MUSIC/'
ни
cd $1
ни даже
eval cd $1
не работают. Приходится ручками вставлять backward slashes, '/home/dmitriid/old\ data/Data\ Big/Mamut/MUSIC/'
Как обойти это ограничение так, чтобы в идеале скрипт без проблем заходил во все встречающиеся на пути директории?
2. Как заставить скрипт заходить в поддиректории? То есть, узнать, что тот или иной файл — это директория, а не файл? Симлинков нет
Спасибо
Re: Bash script - новичок
Здравствуйте, Mamut, Вы писали:
M>Задача такая — надо пробежаться по директориям, включая поддиректории, и выполнить там некоторые действия типа
M>M>id3v2 -C *.mp3
M>java -jar id3iconv-0.2.1.jar -e utf8 .mp3
M>
find -type d -exec чего сделать \;
(\; важно!)
Re[2]: Bash script - новичок
Здравствуйте, aka50, Вы писали:
A>Здравствуйте, Mamut, Вы писали:
M>>Задача такая — надо пробежаться по директориям, включая поддиректории, и выполнить там некоторые действия типа
M>>M>>id3v2 -C *.mp3
M>>java -jar id3iconv-0.2.1.jar -e utf8 .mp3
M>>
Подумал что нужно немного детальнее... ибо find довольно замысловатая штука.
Есть структура каталогов
.
|-- mmm mmm
| `-- test.xtx
`-- ttt ttt
|-- rrr
`-- uuuu
`-- mmm.ttt
4 directories, 2 files
Хотим выполнить в каждой директории
ls -1
echo "----done dir=<here will be dirname>"
Делаем
$ find -type d -exec sh -c "(cd \"{}\" && ls -1 && echo \"----done dir={}\")" \;
mmm mmm
ttt ttt
----done dir=.
rrr
uuuu
----done dir=./ttt ttt
mmm.ttt
----done dir=./ttt ttt/uuuu
----done dir=./ttt ttt/uuuu/mmm.ttt
test.xtx
----done dir=./mmm mmm
Re: Bash script - новичок
Здравствуйте, Mamut, Вы писали:
M>1. Названия директорий содержат пробелы. Таким образом для
M>./script.sh '/home/dmitriid/old data/Data Big/Mamut/MUSIC/'
M>ни
M>cd $1
cd " $1"
M>2. Как заставить скрипт заходить в поддиректории? То есть, узнать, что тот или иной файл — это директория, а не файл? Симлинков нет
просто узнать:
if [ -d "$file" ]; then ...
или, как посоветовали выше, пользоваться find'ом.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Re[3]: Bash script - новичок
A>Делаем
A>A>$ find -type d -exec sh -c "(cd \"{}\" && ls -1 && echo \"----done dir={}\")" \;
A>
Спасибо! То, что доктор прописал!
В итоге у меня получилось страшненько, но работает
find -type d -exec sh -c "(cd \"{}\" && id3v2 -C *.mp3 && id3v2 -s *.mp3
&& java -jar /home/dmitriid/Prerequisites/Linux\ Essentials/id3iconv-0.2.1.jar -e utf8 *.mp3
&& echo \"----done dir={}\")" \;
естественно, в одну строчку
Самое страшное, я даже понимаю, что там происходит
Re[4]: Bash script - новичок
От:
aka50
Дата: 25.12.06 14:42
Оценка:
Здравствуйте, Mamut, Вы писали:
A>>Делаем
A>>A>>$ find -type d -exec sh -c "(cd \"{}\" && ls -1 && echo \"----done dir={}\")" \;
A>>
M>Спасибо! То, что доктор прописал!
M>В итоге у меня получилось страшненько, но работает
M>M>find -type d -exec sh -c "(cd \"{}\" && id3v2 -C *.mp3 && id3v2 -s *.mp3
M>&& java -jar /home/dmitriid/Prerequisites/Linux\ Essentials/id3iconv-0.2.1.jar -e utf8 *.mp3
M>&& echo \"----done dir={}\")" \;
M>
M>естественно, в одну строчку Самое страшное, я даже понимаю, что там происходит
Совет, поставь себе zsh. Тогда можно и не в одну строчку
. И помощь всякая
в консоли... в общем рекомендую
http://rsdn.ru/File/30337/zsh-autocomp.png
Re[4]: Bash script - новичок
Здравствуйте, Mamut, Вы писали:
M>M>find -type d -exec sh -c "(cd \"{}\" && id3v2 -C *.mp3 && id3v2 -s *.mp3
M>&& java -jar /home/dmitriid/Prerequisites/Linux\ Essentials/id3iconv-0.2.1.jar -e utf8 *.mp3
M>&& echo \"----done dir={}\")" \;
M>
Неплохо
M>естественно, в одну строчку Самое страшное, я даже понимаю, что там происходит
Совет, поставь себе zsh. Тогда можно и не в одну строчку . И помощь всякая
в консоли... в общем рекомендую
http://rsdn.ru/File/30337/zsh-autocomp.png
Re[4]: Bash script - новичок
От:
aka50
Дата: 25.12.06 14:48
Оценка:
Здравствуйте, Mamut, Вы писали:
M>M>find -type d -exec sh -c "(cd \"{}\" && id3v2 -C *.mp3 && id3v2 -s *.mp3
M>&& java -jar /home/dmitriid/Prerequisites/Linux\ Essentials/id3iconv-0.2.1.jar -e utf8 *.mp3
M>&& echo \"----done dir={}\")" \;
M>
к стати, немного оффтоп, а ты EasyTag не пробывал использовать... имхо удобнее
и особо кривые теги не запорешь.
http://easytag.sourceforge.net/
Re[5]: Bash script - новичок
A>к стати, немного оффтоп, а ты EasyTag не пробывал использовать... имхо удобнее
A>и особо кривые теги не запорешь. http://easytag.sourceforge.net/
Поставил, начал пользовать, подумал, что руками замучаюсь все исправлять, в итоге запорол кучу тагов
Re: Bash script - новичок
Здравствуйте, Mamut, Вы писали:
M>cd " $1"
Возьми за правило все переменные заключать в кавычки. Без кавычек проблемы бывают не только когда переменная содержит строку с пробелами, но и когда она пустая (например, в сравнениях, типа $1 == "-help" всегда пиши "$1"), иначе в лучшем случае получишь ошибку компиляции/исполнения, а в худшем — у тебя съедут аргументы, т.е, скажем, grep $1 filename для поиска чего-то в файле filename превратится в grep filename, т.е. в поиск слова filename во входном потоке — такие вещи легко могут привести к феерическим последствиям.
Заодно тебе не станут нужны всякие идиотские трюки типа x$1 == x$2 (это проверка на то, что обе переменные либо равны, либо пусты) — сможешь писать по-человечески "$1" == "$2".
Re[3]: Bash script - новичок
От:
jazzer
Skype: enerjazzer
Дата: 26.12.06 09:27
Оценка:
34 (1)
Здравствуйте, aka50, Вы писали:
A>A>$ find -type d -exec sh -c "(cd \"{}\" && ls -1 && echo \"----done dir={}\")" \;
A>
А чтоб не мучиться с бэкслэшами, можно записать так (если у нас не используются переменные):
find -type d -exec sh -c '(cd "{}" && ls -1 && echo "----done dir={}")' \;
либо так (если используются):
find -type d -exec sh -c "(cd '{}' && ls -1 && echo '----done dir={}')" \;
Re[4]: Bash script - новичок
От:
jazzer
Skype: enerjazzer
Дата: 26.12.06 09:29
Оценка:
34 (1)
Здравствуйте, Mamut, Вы писали:
M>естественно, в одну строчку
бэкслэш+ентер никто не отменял
попробуй набрать
l\<enter> s<enter>
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить