посоветуйте мануал по написанию однострочников на баше.

YUAL

и лучше потолще по пространнее и с примерами. а то я чё-то гуглом пользоваться разучился.
на русском желательно.

danilov


man bash

okis

Примеры можно смотреть на commandlinefu.com

YUAL

$ man bash | head
BASH(1) BASH(1)



NAME
bash - GNU Bourne-Again SHell

SYNOPSIS
bash [options] [file]

на русском желательно.

да и документация и мануал не одно и тоже. но я юмор оценил. спасибо.

slonishka

какой блин юмор-то? он правильно тебе все советует.
man bash - это блядь книга, которую даже многие хорошие админы читали не целиком.
русскоязычные маны существуют.
можно на экзамплах учиться, да, как Стасег советует, но вот это как раз уже не документация.
а манпэйдж - это самая настоящая документация.

Dasar

а манпэйдж - это самая настоящая документация.
для старта обычно удобнее читать книгу, чем документацию.
в книге изложение идет от простого к сложному, а в документации бывает такую последовательность тяжело выделить (особенно новичку)
может ТС-у книгу и надо?

YUAL

да. пожалуй я неправильно выразился. хотел бы книгу.

olega

Вот вроде как книга, но не совсем про однострочники:
This tutorial assumes no previous knowledge of scripting or programming, but progresses rapidly toward an intermediate/advanced level of instruction . . . all the while sneaking in little nuggets of UNIX® wisdom and lore. It serves as a textbook, a manual for self-study, and a reference and source of knowledge on shell scripting techniques. The exercises and heavily-commented examples invite active reader participation, under the premise that the only way to really learn scripting is to write scripts.
This book is suitable for classroom use as a general introduction to programming concepts.

YUAL

прочитал пока 1/3 от неё. в русском переводе. в принципе они всё подробно разъясняют. но я мозги свернул в трубочку пока читал. мало объяснений. много примеров. и там скорее всё-таки о программирование на языке bash а например awk grep и sed почти не освещены.

doublemother

awk grep и sed почти не освещены.
Ну ты же догадаешься, какие man'ы тебе для этого почитать, да?

YUAL

ну ты же догадался куда тебе идти?

olega

> прочитал пока 1/3 от неё <...> мозги свернул в трубочку пока читал.
Ну да, автор честно предупреждают (и я с ним согласен что "the only way to really learn scripting is to write scripts".
> например awk grep и sed почти не освещены.
Про полезные внешние команды (в т.ч. grep) есть раздел "16. External Filters, Programs and Commands", минимальное введение в sed и awk в есть приложении C.
А вообще sed и awk это полноценные языки программирования, и их детальное изучение, как мне кажется, несколько выходит за рамки "однострочников на баше".

doublemother

ну ты же догадался куда тебе идти?
Не хочешь, как хочешь. Я не знаю другого способа научиться писать скрипты, кроме как, читая ABSG и ман-страницы и создавая скрипты.
Нет, можно конечно купить какую-нибудь книжку с названием типа "Консоль Linux", но лучшее, на что при этом можно рассчитывать — эволюция в пиздоскриптолога.

YUAL

чтобы быть пиздоскриптологом вообще никаких книг не нужно.
я этим занимался в самом начале освоения линукса.

slonishka

ну я, кстати, тоже пизжу скрипты и делаю их под себя.
по-моему, лучший способ написать код - спиздить его.
зачем писать свой, когда дохуя готового?
осталось только спиздить и допилить под себя / текущую задачу.

Serab

Ну ты же догадаешься, какие man'ы тебе для этого почитать, да?
по sed'у ман слишком лаконичен. По sed'у могу посоветовать http://www.gentoo.org/doc/en/articles/l-sed1.xml и далее, там три части, по awk начать опять же можно с http://www.gentoo.org/doc/en/articles/l-awk1.xml.
Дальше по sed'у можно почитать info sed, там с примерами тоже, в том числе с крутыми. Еще для прокачки однострочности можно поглядеть info coreutils, там тоже все разобрано. Там в info coreutils можно начать прямо с главы 29 «Opening the software toolbox», там в некотором смысле совсем для новичков, но я читал пару месяцев назад, помню, что увидел там что-то новое :)
Один минус: надо уметь читать info :grin:

Serab

и да, про русский язык: надо когда-то выбираться из темницы, читай доку со словарем, заодно и язык освоишь, благо IT-английский довольно прост.

YUAL

да ну я умею читать на английском доки и без словаря.
это скорее религиозного плана вопрос. ну нравится мне читать на русском.

Serab

ок, неправильно понял тады. Ну блин, сложно же с такой религией жить :)

YUAL

на самом деле объясняется просто. скорость моего чтения на русском очень велика. я не верю что когда-нибудь скорость моего чтения на английском приблизится к этой величине. чтение на такой скорости мне доставляет удовольствие, даже если я читаю женский роман. техническая литература читается конечно медленнее, но тоже с комфортной для меня скоростью и доставляет удовольствие. чтение с другой скоростью напоминает пытку.

YUAL

по awk начать опять же можно с http://www.gentoo.org/doc/en/articles/l-awk1.xml.
нашёл приятный мануал. http://www.lissyara.su/doc/programming/awk/

dangerr

Я изучал shell по классике. bash правда там не рассматривается, так как на момент написания книги его ещё не существовало. Но если тебе главное язык, а не конкретная реализация, то есть смысл посмотреть:
Керниган, Пайк - UNIX – универсальная среда программирования.

YUAL

с седом стало получше. но awk и собственно сам баш взрывают мне мозг.

bleyman

с седом стало получше. но awk и собственно сам баш взрывают мне мозг.
RLY?
Из трёх перечисленных awk самый вменяемый, по-моему. Типа, нормальный язык программирования, куча кусочков кода, которые триггерятся регекспом перед ними (или особыми словами типа BEGIN, END а внутри всё как у людей, обычные переменные, обычные параметры, всё такое. Сам язык похож на С и жаваскрипт.
Баш стремнее, но моё общение с ним стало несколько легче когда я обнаружил single-quote strings (FYI, to escape a single quote inside one you write '\''). Ну и осознал, как всякие if работают.
Сед же состоит из какого-то непознаваемого пиздеца. Я настолько не хочу в него вдаваться, что даже написал себе питоноскрипт который как бы применяет s/.../.../g, но с питоновскими регекспами.

slonishka

да, sed - пиздецовый язык.

YUAL

да, sed - пиздецовый язык.
да и авк с башем пиздецовые языки.

rosali

> документация и мануал не одно и тоже
вообще-то man это от слова manual :confused:

apl13

Мануал и мануал — не одно и то же. :umnik:

YUAL

ну ладно. признаю: хуйню сморозил. хорош стебаться.
лучше подскажите идею для решения задачки:
посчитать размер всех мп3 файлов в каталоге и всех подкаталогах и вывести одной строкой. уложиться в минимальное кол-во знаков. решение через ls -lR | awk 'бла-бла' занимает около 40 символов
через du -ca **/*.mp3 | tail -1 меньше но требует либо zsh илбо включение рекурсивного глобинга в баше, что занимает существеное кол-во символов.
как-то больше идей нет.

apl13

Короче вряд ли сделаешь.
du -ca $(find . -name '*.mp3') | tail -n 1
— это 42 символа.

procenkotanya

echo -n 'du -c `find -name \*.mp3` | tail -1' | wc -c
35
:-p

Serab

ну еще пробелы вокруг пайпа удалите, да

apl13

echo -n 'du -c `find -name \*.mp3`|tail -1' | wc -c
33

:mog:

apl13

Апиридил! :)

YUAL

ну твоё решение как минимум можно сократить до
 
  du -ca $(find . -name '*.mp3')|tail -1
а это уже 38 символов
но это решение не работает при наличии пробелов в именах файлов.

YUAL

find -name \*.mp3`|tail -1
N130:~/music$ du -c `find -name \*.mp3`|tail -1
du: невозможно получить доступ к «./Lumen/2011»: Нет такого файла или каталога
du: невозможно получить доступ к «-»: Нет такого файла или каталога
du: невозможно получить доступ к «Лабиринт/004»: Нет такого файла или каталога
du: невозможно получить доступ к «-»: Нет такого файла или каталога
du: невозможно получить доступ к «Дотянуться»: Нет такого файла или каталога
du: невозможно получить доступ к «до»: Нет такого файла или каталога
du: невозможно получить доступ к «звезды»: Нет такого файла или каталога
du: невозможно получить доступ к «(Санкт-Петербург»: Нет такого файла или каталога
du: невозможно получить доступ к «29.10.2010).mp3»: Нет такого файла или каталога
du: невозможно получить доступ к «./Lumen/2011»: Нет такого файла или каталога
du: невозможно получить доступ к «-»: Нет такого файла или каталога
du: невозможно получить доступ к «Лабиринт/009»: Нет такого файла или каталога
du: невозможно получить доступ к «-»: Нет такого файла или каталога
du: невозможно получить доступ к «Пора»: Нет такого файла или каталога
du: невозможно получить доступ к «орать!»: Нет такого файла или каталога
du: невозможно получить доступ к «(Омск»: Нет такого файла или каталога
du: невозможно получить доступ к «15.10.2010).mp3»: Нет такого файла или каталога
du: невозможно получить доступ к «./Lumen/2011»: Нет такого файла или каталога

apl13

find . -name '*.mp3' | while read name ; do du "$name" ; done | awk '{size += $1} END {print size}'

apl13

find . -name '*.mp3' | while read name ; do du "$name" ; done | cut -f 1 | tr '\n' ' ' | sed 's/\>/ +/g' | sed 's/^/0 /' | sed 's/$/p/' | dc

apl13

du: невозможно получить доступ к «Лабиринт/004»: Нет такого файла или каталога
Убей, пожалуйста, все такие каталоги у себя. Спасибо.

hwh2010

Убей, пожалуйста, все такие каталоги у себя. Спасибо.
Убей пожалуйста все такие каталоги во всём мире, включая архивы
спасибо

Serab

rm -rf * && echo 0

Serab

бля, если кто на фантанах, угощу пивом :D

apl13

Ты с телефона, что ли, пишешь?

apl13

Убей вообще все! Спасибо.

Serab

не, у миня ёта :D

apl13

Скрипт из корректно обрабатывает имена файлов с пробелами, но тебе каждый раз придется с ними так мучаться. Это глупая Windows95™-привычка.

YUAL

длинноватенько. моё решение:
 du -a|awk '/mp3$/{s+=$1}END{print s}' 
но что-то мне подсказывает его не оптимальность. 37 символов.

apl13

Оставь пиво, я потом выпью. :umnik: :drink:

YUAL

Скрипт из корректно обрабатывает имена файлов с пробелами, но тебе каждый раз придется с ними так мучаться. Это глупая Windows95™-привычка.
написать скрипт коректно обрабатывающий пробелы - меньший гемор, чем переименовывать свою музыкальную колекцию.
Учитывая, что музыка у меня хранится по альбомам, а некоторые алюбом содежат в названии пробелы. или предлагаешь их везде заменить на подчёркивание?
свои файлы и папки я ясен пень создаю на английском в нижнем регистре без пробелов.

apl13

написать скрипт коректно обрабатывающий пробелы - меньший гемор, чем переименовывать свою музыкальную колекцию.
Всего-то один раз написать корректно обрабатывающий пробелы скрипт, который переименует всю коллекцию. :)
Еще теги в UTF-8 переведи.

YUAL

теги у меня и так в утф 8.
и как ты предлагаешь переименовывать коллекцию? через подчёркивания или просто пробелы все выпилить?

apl13

через подчёркивания

Dasar

:p
ls -r *.mp3 | %{$_.Length} | measure -Sum | %{$_.Sum}

YUAL

представил себе работу такого скрипта:
music/Jimi_Hendrix/Jimi_Hendrix_-_Experience_Hendrix_-_The_Best_Of_Jimi_Hendrix_[digitally_remastered]2010_(320 kbps)/09._Little_Wing.mp3
ты раб операционной системы, если вынужден терпеть такое. нахуй оно мне надо?
сравни с
music/Jimi Hendrix/Jimi Hendrix - Experience Hendrix - The Best Of Jimi Hendrix [digitally remastered]2010 (320 kbps)/09. Little Wing.mp3

YUAL

ls -r *.mp3 | %{$_.Length} | measure -Sum | %{$_.Sum}
N130:~/music$ ls -r *.mp3 | %{$_.Length} | measure -Sum | %{$_.Sum}
measure: команда не найдена
%{.Sum}: команда не найдена
%{.Length}: команда не найдена

Serab

find_._-name_'*.mp3'_|_while_read_name_;_do_du_"$name"_;_done_|_awk_'{size_+=_$1}_END_{print_size}'

YUAL

это всё т пива.

apl13

ты раб операционной системы
Это мне говорит человек, который каждый раз будет писать скрипт для имен с пробелами, потому что когда-то в ГЗ накачал у кого-то нормального музона с винды.

apl13

нахуй оно мне надо?
сравни с
music/Jimi Hendrix/Jimi Hendrix - Experience Hendrix - The Best Of Jimi Hendrix [digitally remastered]2010 (320 kbps)/09. Little Wing.mp3
Объясни, пожалуйста, нахуй тебе нужна форма с пробелами. Ты еженедельно распечатываешь список файлов и вешаешь в рамочке?

Dasar

свои файлы и папки я ясен пень создаю на английском в нижнем регистре без пробелов.
это разве не рабство?

Dasar

Объясни, пожалуйста, нахуй тебе нужна форма с пробелами.
потому что это вносит меньше искажений в именование файлов

YUAL

это разве не рабство?
нет. я делаю это не из-за то го что по-другом скрипту работать не будут, а потому что одно слово на английском в нижнем регистре быстрее набрать, когда придумываешь название файла.

doublemother

find -name '*.mp3' -print0|xargs -0 du -cbsh|tail -1

Чмоке рабам подчёркиваний.

YUAL

find -name '*.mp3' -print0|xargs -0 du -cbsh|tail -1
N130:~/music$ find -name '*.mp3' -print0|xargs -0 du -cbsh|tail -1
5,7G итого

N130:~/music$ ls -lR|awk '/mp3$/{s+=$5}END{print s/1024^3}'
14.3268

предпочитаю верить второму скрипту. во всяком случае его ответ согласуется с мнением банши, который утверждает что у меня 14.3 гига музыки

Serab

ога, выводит размер последнего чанка, который выделил xargs. Чмоке и вам :)

Serab

выведи wc -l пжалста (количество файлов)

Serab

Бля! КОНТРА был прав!

YUAL

N130:~/music$ ls -lR | wc -l
3000
N130:~/music$ ls -lR | grep "mp3$"|wc -l
2048

YUAL

Бля! КОНТРА был прав!
когда?

Serab

find -name '*.mp3' -print0|xargs -0 du -cbsh|grep итого
:grin:

serega1604

>Чмоке рабам подчёркиваний.
угу, чмоке
find -name \*mp3 -print0|du -ch --f=-|tail -1

YUAL

find -name \*mp3 -print0|du -ch --f=-|tail -1
а откуда ты узнал что ключ --f равносилен --files0-from ?
в мане такого нет.

serega1604

опыт, батенька, опыт.

slonishka

а откуда ты узнал что ключ --f равносилен --files0-from ?
в мане такого нет.
обычно в таких случаях читают имена ключей с начала до момента,
когда дальше остался только один допустимый.
например --apparent-size <=> --ap у du
это есть в исходном коде, причем не только у du, а вообще много где.
причем, на это даже не особо опасно рассчитывать.
конечно, если пишешь свой скрипт, который кому-то потом отдашь, лучше писать целиком.
а если руками команду вбиваешь, то вполне не возбраняется так сокращать, имхо.

Dasar

а диры, кстати, в этих однострочниках когда отфильтровываются? или считается что они не могут помешать?

Dasar

если в рамках близкого к идеалу синтаксиса, то мне нравится что-то типа:
./:File[mp3].Size => Sum
./:File[.Name=%'.mp3'].Size => Sum
./:File[.Ext=mp3].Size => Sum
ps
. - запрос к текущему контексту
/ - рекурсивный
: - выход из текущего пространства имен
[] - фильтрация
=% - EndsWith, строка оканчивается на данную строку
=> - жадная передача всего предыдущего результата в следующую функцию
- вызов функции

YUAL

а диры, кстати, в этих однострочниках когда отфильтровываются? или считается что они не могут помешать?
собственно никак. предполагается что папки вряди будут называться *.mp3
проапрегрйженная версия моего решения

du -a|awk '/mp3$/{s+=$1}END{print s/1024^2}
фильтрует на первой стадии.

Dasar

но при этом хавает файлы tmp3?

apl13

Тебе, как всегда, нравится какой-то вырвиглазный пиздец.

Dasar

обычный фя

apl13

Ну вот не надо.

Dasar

Ну вот не надо.
синдром утенка в запущенной стадии детектед

apl13

Прожуй сперва.
Оставить комментарий
Имя или ник:
Комментарий: