(no subject)
Friday, July 1st, 2005 11:46for c in `ls -p | grep /`; do echo $c; l=`find $c -print | grep htm | xargs ls -l | awk '{ print $5; print "+" }'; echo 0`; echo $l | bc; done
Всё это совершенно неправильно и должно делаться по-другому (find|grep убрать, например), зато просто работает, здесь и сейчас, с первого раза и без геморроя. Я крут, я джедай,я знаю албанский.
Всё это совершенно неправильно и должно делаться по-другому (find|grep убрать, например), зато просто работает, здесь и сейчас, с первого раза и без геморроя. Я крут, я джедай,

no subject
Date: Friday, July 1st, 2005 10:50 am (UTC)мне эта штука точку сборки сдвигает. :))))
no subject
Date: Friday, July 1st, 2005 10:52 am (UTC)no subject
Date: Friday, July 1st, 2005 10:58 am (UTC)no subject
Date: Friday, July 1st, 2005 11:22 am (UTC)Итак, конечный результат - for c in `ls -p | grep /`; do echo $c; l=`find $c -print | grep htm | xargs ls -l | awk '{ print $5; print "+" }'; echo 0`; echo $l | bc; done. Смотрим по кускам.
ls -p выдаст список файлов с закорлючкой на конце, которая показывает тип файла. Например, у меня в домашнем каталоге "просто ls" выводит список такого вида: "backup Desktop dev eyecandy lj Mail misc music new-site notes pix reports Templates Trash warez workdata" (по одной хрени на строку), а ls -p выведет "backup/ Desktop/ dev@
eyecandy/ lj/ Mail/ misc/ music/ new-site@ notes@ pix/ reports@ Templates/ Trash/ warez/ workdata/". Те, которые с "/" в конце - это каталоги.
grep / отфильтрует только те строчки, которые содержат "/", соответственно, это будут каталоги.
Таким образом, for c in `ls -p | grep /`; do тутчтоугодно; done - это будет цикл, где фрагмент тутчтоугодно прокрутится N раз с разными значениями переменной $c. (Сравни: for c in foo bar baz; do echo $c; done выведет "foo bar baz", а конструкция echo My system is `uname` (предполагая, что команда uname выводит строку "Linux") выведет строку "My system is Linux").
Дальше. find $c -print | grep htm | xargs ls -l. Первая часть, find $c -print, просто вывалит список всех файлов во всех подкаталогах каталога, передаваемого переменной $c. Вторая, grep htm, вырежет из этого потока строк только те, которые содержат подстроку "htm" (независимо от того, будет это ./foo/bar.html или ./public_html/price.zip; в принципе, это глюк, но я примерно знаю, какие там имена файлов и каталогов, поэтому сойдёт). Самая сложная часть — xargs ls -l. Эта хрень, xargs, работает таким образом: все строчки, которые ей поступают, она "склеивает" со всеми своими аргументами (сначала свои аргументы, потом строчка), и запускает это как отдельную команду. (Сравни: echo -e "String one\nString two" | xargs echo выполнит сначала echo String one, потом выполнит echo String two). Соответственно, мы кучу раз выполняем ls -l имя_найденного_файла.
Ещё веселее. awk '{ print $5; print "+" }' просто напишет 5-ю колонку того, что ему поступило, и символ "+" после него. Кстати, 5-я колонка вывода ls -l — это размер файла. После этого (через ";") стоит echo 0, это чтобы последний "+" не висел в воздухе.
bc просто выполнит выражение, которое ей придёт на вход. Если мы сделаем echo 2+2 | bc, то на выход попадёт 4.
Складывая всё вместе. Мы для всех каталогов пишем имя этого каталога и после этого — число байт, занимаемых html-файлами в этом каталоге.
no subject
Date: Saturday, July 2nd, 2005 08:24 pm (UTC)no subject
Date: Monday, July 4th, 2005 06:05 am (UTC)no subject
Date: Monday, July 4th, 2005 06:08 am (UTC)Для решения довольно просто сформулированной задачи понадобилось писать гору команд...
Хотя подумав, не могу понять, как еерешить компактнее и поизящнее
поэтому и присвистнул - простая задача, а как решается!!!
no subject
Date: Monday, July 4th, 2005 06:36 am (UTC)В zsh:
setopt -3
for c in */; do echo -n "$c: "; cat $c**/*.htm | wc -c; done 2>/dev/null
Но это совсем грязный хак. wc -c для подсчёта размера - это (потенциально) very expencive way, использование cat $c**/*.htm с опцией NO_NOMATCH (включается setopt -3) выдаёт строку as is (например, в подкаталоге css нет ни одного файоа с расширением htm, поэтому для $c=css/ будет пытаться выполниться cat css/**/*.htm (а сам cat, есс-но, скажет, что нет такого файла)... Короче, всё понятно :)
no subject
Date: Monday, July 4th, 2005 06:44 am (UTC)типа символической ссылки с именем zero.htm на /dev/zero
;)
no subject
Date: Monday, July 4th, 2005 02:11 pm (UTC)При условии, что я правильно понял задачу - подсчитать общий размер всех файлов *htm* в текущей директории и ее поддиректориях, - так будет все же быстрее. Можно видоизменить, скажем, на , чтобы искать только по расширениям .htm/.html. В принципе, и вариант с find/grep/bla-bla был рабочим, просто иногда сокращенные конструкции заметно сокращают время работы и отладки :)
no subject
Date: Monday, July 4th, 2005 02:19 pm (UTC)cgi-bin/ 891
company/ 32258
css/ 0
files/ 0
forum/ 121278
hi-tech/ 114132
[...]
А в случае "просто подсчитать объём всех html-файлов" - imho, самый простой вариант (в zsh) - это что-то вроде cat **/*htm* | wc -c.
no subject
Date: Monday, July 4th, 2005 02:39 pm (UTC)Я вообще по делу пришел: ты как-то писал, что пометил все записи в ЖЖ как "friends-only". Осталось то, чем пометил? А то я нашел только LJ::Simple, но пока с ним игрался, нарвался на "Client is making repeated requests. Perhaps it's broken?" :(
no subject
Date: Monday, July 4th, 2005 02:50 pm (UTC)no subject
Date: Tuesday, July 5th, 2005 06:13 am (UTC)no subject
Date: Tuesday, July 5th, 2005 06:38 am (UTC)