- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
#!/bin/bash
musicdir='/home/neko/Music/mdata'
maxval=`ls -1 $musicdir | wc -l`
randomize() {
rndnum=`echo $[$(echo $[$RANDOM % $maxval])+1]`
}
randomize;
while [ "$rndnum" == 0 ]; do randomize; done
rndsong=`ls $musicdir | head -n $rndnum | tail -n 1`
echo $rndsong
это ж говнокод(:
Название заболевания: bashism.
Симптомы: попытка писать все то, что традиционно делается компилируемыми программами, скриптами на bash'е.
Да даже и на баше ... можно было бы `ls -1 $musicdir` в массив засунуть и не мучать систему постоянным сканированием директории :D
В данном случае IMO это лучше было бы делать на Perl или любом другом скриптовом языке поддерживающим массивы.
Например:
export musicdir=/home/neko/Music/mdata
perl -e '@a=<'$musicdir'/*>; print $a[int rand $#a],"\n"'
или (выдает новый пестнь по нажатию ентера):
perl -ne 'BEGIN{ @a=<'$musicdir'/*> } print $a[int rand $#a],"\n"'
Недавно на работе замочил утилиту переименовывания файлов, потому что на шелле она записывалась в 5 строчек, а на C в 70, да еще надо ее было компилировать.
Не спорю, на перле короче, зато баш встретить вероятность больше, чем перл:)
int main( int argc, char *argv[] )
{
time_t clock;
struct tm *tm;
char timestr[12+1];
char fname[999];
char oldname[999];
int i = 1;
clock = time((time_t *)NULL);
tm = localtime(&clock);
memset( fname, '\0', sizeof(fname) );
memset( oldname, '\0', sizeof(oldname) );
sprintf( timestr, "%02d%02d%02d%02d%02d%02d", tm->tm_year%100, tm->tm_mon,
tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec );
if ( argc>1 )
{
for ( i=1;i<argc;i++)
{
if ( strlen( argv[i]) >= 15 )
{
strcpy( oldname, argv[i] );
argv[i][strlen(argv[i])-4]='\0';
sprintf( fname, "%s_%s.old" , argv[i], timestr );
rename( oldname, fname );
}
}
}
return 0;
}
а стало
curtime=`date +%y%m%d%H%M%S`
for i in $*; do
test ${#i} -le 15 && continue
mv $i ${i%????}_$curtime.old
done
Тут еще все просто, нет рекурсии, а то сразу бы добавилось чтение каталогов, куча проверок, stat... И все равно это переименование было использовано в скрипте (к чести создателей, рекурсия была именно в нем, в сишник ее не потащили)! Так что лишнюю сущность убил:)
eval arr=(`ls $musicdir`)
echo ${arr[$(($RANDOM%${#arr[*]}))]}
да две строчки, но посчитай сколько скобок/прочего тут.
За это платим некоторой примитивностью. Но выбирать орудие все равно надо в каждом конкретном случае (например, давеча писал себе штуку для проставления IPTC&XMP данных на фотки), думал, как писать, наконец, остановился на TCL, в 150 строчек влезло все, что мне на данный момент надо. А на C(++) это был бы целый проект с использованием кучи библиотек.
TCL-ный вариант в качестве бонуса мультиплатформенен.
Традиционно подобные вещи пишутся на компилируемых языках.
И что, это тиклизм?
А главное, зачем тут обфускация???
И зачем цикл проверки на 0, там же он не может случиться?
Выбор из листинга через head с tail тоже сильно.
Короче, зачот!