stogerc 03.07.2010 22:49
Скрипты — Выбираем случайную обоину на рабочий стол
Рассмотрим работу этого однострочника, может кому-нибудь, например новичкам, пригодится.
1) Считаем количество обоин, для этого используем программу wc с параметром -l которая подсчитает количество строк вывода команды ls ~/wallpapers/*.jpg
2) Генерируем случайное число так, чтобы это число не превышало количество файлов обоин в папке.
3) Но RANDOM генерирует числа начиная с нуля, и не затрагивает максимальное число, то есть номер последней обоины, поэтому прибавляем к получившемуся сгенерированному числу еденичку.
4) Из вывода ls ~/wallpapers*.jpg берём строку под случайным номером, который только что сгенерировали, эта строка будет содержать путь к файлу обоины.
5) Осталось только передать путь какой-нибудь программе, в данном случае это feh и установить обоину на рабочий стол.
Теперь можно поставить эту команду на хоткей или добавить в crontab и не нужно устанавливать какие-то специальные утилиты, если вы хотите видеть каждый день что-нибудь новое на своём рабочем столе ;)
Update
Товарищ muhas предложил более простой вариант. Краснею и прилагаю более Ъ версию однострочника:
я конечно извиняюсь за занудство, но
зачем два раза вызвать ls, можно же всё сделать намного проще и короче и даже не вызывая sed
а тепперь по пунктам.
sort -R
параметр -R обеспечивает рандомную сортировку
head -n 1
выводим шапку из одной строки (можно и tail -n 1, т.е. одну строку снизу или sed'ом awk'ом обрабатывать строки - но тут не принципиально ибо всё-равно рандомная сортировка)
собственно весь вывод ls (sort и head) можно обработать одной командой awk но это для гурманов, ибо авк язык не простой - но мощьный(я сам осилил меньше минимума, честно)...
херь взятая в кавычки ` означает что вместо этого подставлять результат выполнения команды а не саму команду (аналог $(команда))
параметр для feh означает центрирование картинки, есть ещё --bg-scale для растягивания и прочие...
Да, Я Зануда, но команда из поста мне показалась огромной и нерациональной...
зачем два раза вызвать ls, можно же всё сделать намного проще и короче и даже не вызывая sed
1 |
|
а тепперь по пунктам.
sort -R
параметр -R обеспечивает рандомную сортировку
head -n 1
выводим шапку из одной строки (можно и tail -n 1, т.е. одну строку снизу или sed'ом awk'ом обрабатывать строки - но тут не принципиально ибо всё-равно рандомная сортировка)
собственно весь вывод ls (sort и head) можно обработать одной командой awk но это для гурманов, ибо авк язык не простой - но мощьный(я сам осилил меньше минимума, честно)...
херь взятая в кавычки ` означает что вместо этого подставлять результат выполнения команды а не саму команду (аналог $(команда))
параметр для feh означает центрирование картинки, есть ещё --bg-scale для растягивания и прочие...
Да, Я Зануда, но команда из поста мне показалась огромной и нерациональной...
gwk 03.07.2010 23:19 #
+ 1 -
а по названию подумалось, что это генератор картинок, которые потом лягут на стол
Я думаю, что очень полезно иногда вот так по пунктам лаконично давать пояснения подобным однострочникам. Новичкам само собой, но и более опытным людям, чтобы быстрее вникнуть в суть кода среди сотен других новостей. Спасибо автору.
я конечно извиняюсь за занудство, но
зачем два раза вызвать ls, можно же всё сделать намного и даже не вызывая sed
а тепперь по пунктам.
собственно весь вывод ls (sort и head) можно обработать одной командой awk но это для гурманов, ибо авк язык не простой - но мощьный(я сам осилил меньше минимума, честно)...
херь взятая в кавычки ` означает что вместо этого подставлять результат выполнения команды а не саму команду (аналог $(команда))
параметр для feh означает центрирование картинки, есть ещё --bg-scale для растягивания и прочие...
Да, Я Зануда, но команда из поста мне показалась огромной и нерациональной...
зачем два раза вызвать ls, можно же всё сделать намного и даже не вызывая sed
feh --bg-center `ls ~/wallpapers*.jpg | sort -R |head -n 1`
а тепперь по пунктам.
sort -R
это в сишной локале рандомно сортируем =) (параметр -R это и есть рандомная сортировка, для эстетов LANG=C можно добавить, а то мало ли в вашей локали херово sort работает(но я такого не замечал ни с одной локалью))head -n 1
выводим шапку из одной строки (можно и tail -n 1, т.е. одну строку снизу или sed'ом awk'ом обрабатывать строки - но тут не принципиально ибо всё-равно рандомная сортировка)собственно весь вывод ls (sort и head) можно обработать одной командой awk но это для гурманов, ибо авк язык не простой - но мощьный(я сам осилил меньше минимума, честно)...
херь взятая в кавычки ` означает что вместо этого подставлять результат выполнения команды а не саму команду (аналог $(команда))
параметр для feh означает центрирование картинки, есть ещё --bg-scale для растягивания и прочие...
Да, Я Зануда, но команда из поста мне показалась огромной и нерациональной...
можно же всё сделать намного и даже не вызывая sed
можно же всё сделать намного проще и короче и даже не вызывая sed /fixed, а то что-то писал и не дописал моменты...
Ох, спасибо, добавлю ка ваш вариант в пост, я сам немного новичок просто...
всегда пожалуйста(только пофикси плз, а то я в своем комменте указал лишку по поводу локали в sort -R (запускаю без локали) - я не люблю в себе зануду, но всё же он иногда выходит наружу =)
найдется когда тебе таких зануд как я будет много попадатся, у меня ведь именно из-за таких и родился во мне зануда =)
тоже причитали что cat file |more это тоже самое что и more file и тому подобное - теперь на смену некоторым из них пришел и мой зануда =)
тоже причитали что cat file |more это тоже самое что и more file и тому подобное - теперь на смену некоторым из них пришел и мой зануда =)
Чтобы сменить обоину в гноме:
gconftool-2 -t string -s /desktop/gnome/background/picture_filename <путь к файлу изображения>
/* К теме подключается ещё один зануда, который, к тому же, слоупок. */
В ArchWiki есть замечательная конструкция, которая делает то же самое:
Это можно переписать и вот так:
Няшки:
А вообще я некоторое время игрался вышеприведённым однострочником, но бросил: банально надоело. Сейчас опять меняю обои вручную, примерно раз в пару месяцев — и нормально. Но это, конечно же, дело вкуса…
В ArchWiki есть замечательная конструкция, которая делает то же самое:
find $HOME/.wallpaper -type f -name '*.jpg' -o -name '*.png' | shuf -n 1 | xargs feh --bg-scale
Это можно переписать и вот так:
feh --bg-scale "`find $HOME/.wallpaper -type f -name '*.jpg' -o -name '*.png' | shuf -n 1`"
Няшки:
- shuf входит в coreutils, а значит, есть на любой системе; он успешно заменяет конструкцию sort -R | head -1
- благодаря использованию find в качестве обоины могут быть заюзаны не только те изображения, которые лежат непосредственно в ~/.wallpaper, но и в любой поддиректории этого каталога
- опять-таки благодаря find мы можем использовать обои в любом формате — достаточно дописать после "-name '*.png'" строку "-o -name '*.расширение'". С ls такое провернуть сложнее (если только вы не выполняете однострочник в ZSH — там такие конструкции можно легко записать в виде *.(jpg|png|расширение))
А вообще я некоторое время игрался вышеприведённым однострочником, но бросил: банально надоело. Сейчас опять меняю обои вручную, примерно раз в пару месяцев — и нормально. Но это, конечно же, дело вкуса…