Bash script - новичок
От: Mamut Швеция http://dmitriid.com
Дата: 25.12.06 13:43
Оценка:
Задача такая — надо пробежаться по директориям, включая поддиректории, и выполнить там некоторые действия типа

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. Как заставить скрипт заходить в поддиректории? То есть, узнать, что тот или иной файл — это директория, а не файл? Симлинков нет

Спасибо


dmitriid.comGitHubLinkedIn
Re: Bash script - новичок
От: aka50 Россия  
Дата: 25.12.06 13:53
Оценка: 36 (1)
Здравствуйте, 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 Россия  
Дата: 25.12.06 14:09
Оценка: 54 (1)
Здравствуйте, 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 - новичок
От: ДимДимыч Украина http://klug.org.ua
Дата: 25.12.06 14:18
Оценка: 38 (3) +1
Здравствуйте, 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 - новичок
От: Mamut Швеция http://dmitriid.com
Дата: 25.12.06 14:31
Оценка: :)
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={}\")"  \;


естественно, в одну строчку Самое страшное, я даже понимаю, что там происходит


dmitriid.comGitHubLinkedIn
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 - новичок
От: aka50 Россия  
Дата: 25.12.06 14:43
Оценка: 17 (1)
Здравствуйте, 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 - новичок
От: Mamut Швеция http://dmitriid.com
Дата: 26.12.06 08:14
Оценка: :)
A>к стати, немного оффтоп, а ты EasyTag не пробывал использовать... имхо удобнее
A>и особо кривые теги не запорешь. http://easytag.sourceforge.net/

Поставил, начал пользовать, подумал, что руками замучаюсь все исправлять, в итоге запорол кучу тагов


dmitriid.comGitHubLinkedIn
Re: Bash script - новичок
От: jazzer Россия Skype: enerjazzer
Дата: 26.12.06 09:21
Оценка: 35 (2) +1
Здравствуйте, Mamut, Вы писали:

M>cd "$1"

Возьми за правило все переменные заключать в кавычки. Без кавычек проблемы бывают не только когда переменная содержит строку с пробелами, но и когда она пустая (например, в сравнениях, типа $1 == "-help" всегда пиши "$1"), иначе в лучшем случае получишь ошибку компиляции/исполнения, а в худшем — у тебя съедут аргументы, т.е, скажем, grep $1 filename для поиска чего-то в файле filename превратится в grep filename, т.е. в поиск слова filename во входном потоке — такие вещи легко могут привести к феерическим последствиям.

Заодно тебе не станут нужны всякие идиотские трюки типа x$1 == x$2 (это проверка на то, что обе переменные либо равны, либо пусты) — сможешь писать по-человечески "$1" == "$2".
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
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={}')"  \;

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[4]: Bash script - новичок
От: jazzer Россия Skype: enerjazzer
Дата: 26.12.06 09:29
Оценка: 34 (1)
Здравствуйте, Mamut, Вы писали:

M>естественно, в одну строчку

бэкслэш+ентер никто не отменял

попробуй набрать
l\<enter>s<enter>

jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.