- 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
guest 25.03.2010 14:05 # +2.4
snoopcatt 26.03.2010 19:59 # −1
это ж говнокод(:
linux-hacker 06.04.2010 23:23 # +1
Dummy00001 28.03.2010 00:36 # −1.6
Название заболевания: bashism.
Симптомы: попытка писать все то, что традиционно делается компилируемыми программами, скриптами на bash'е.
Да даже и на баше ... можно было бы `ls -1 $musicdir` в массив засунуть и не мучать систему постоянным сканированием директории :D
guest 01.04.2010 10:32 # +1.2
Dummy00001 01.04.2010 12:57 # −1
В данном случае 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"'
guest 01.04.2010 13:20 # +1
Недавно на работе замочил утилиту переименовывания файлов, потому что на шелле она записывалась в 5 строчек, а на C в 70, да еще надо ее было компилировать.
Не спорю, на перле короче, зато баш встретить вероятность больше, чем перл:)
Dummy00001 01.04.2010 13:31 # 0
guest 01.04.2010 15:15 # 0
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... И все равно это переименование было использовано в скрипте (к чести создателей, рекурсия была именно в нем, в сишник ее не потащили)! Так что лишнюю сущность убил:)
guest 01.04.2010 13:28 # 0
eval arr=(`ls $musicdir`)
echo ${arr[$(($RANDOM%${#arr[*]}))]}
Dummy00001 01.04.2010 13:30 # −1
да две строчки, но посчитай сколько скобок/прочего тут.
guest 01.04.2010 15:19 # +1
За это платим некоторой примитивностью. Но выбирать орудие все равно надо в каждом конкретном случае (например, давеча писал себе штуку для проставления IPTC&XMP данных на фотки), думал, как писать, наконец, остановился на TCL, в 150 строчек влезло все, что мне на данный момент надо. А на C(++) это был бы целый проект с использованием кучи библиотек.
TCL-ный вариант в качестве бонуса мультиплатформенен.
guest 01.04.2010 15:21 # −1
Традиционно подобные вещи пишутся на компилируемых языках.
И что, это тиклизм?
guest 01.04.2010 10:29 # 0
А главное, зачем тут обфускация???
И зачем цикл проверки на 0, там же он не может случиться?
Выбор из листинга через head с tail тоже сильно.
Короче, зачот!