LINUX.ORG.RU

Полезные консольные скрипты

 ,


0

0

В статье "Магия консольных одностроковых скриптов" приведены примеры того, как можно получить простые и полезные решения за счет всего одной строчки в командной строке bash. Давайте не будем разводить пустой флейм по поводу бесполезности статьи и хвастаться тем, что вы уже всё это давно знаете. Лучше приведите в комментариях примеры полезных скриптов, которые используете сами - может получиться очень интересный материал.

>>> Подробности

★★★

Проверено: Shaman007 ()

du --max-depth=1 $1|sort -n -k 1 |awk '{ printf "%.3f Mb \t%s\n", (0+$5)/1024.0/1024.0, $0 }' -

ls -lr $1|sort -n -k 5 |awk '{ printf "%.3f Mb \t%s\n", (0+$5)/1024.0/1024.0, $0 }' -

anonymous
()
Ответ на: комментарий от anonymous

err,
s/du --max-depth=1 $1|sort -n -k 1 |awk '{ printf "%.3f Mb \t%s\n", (0+$5)/1024.0/1024.0, $0 }' -/
du --max-depth=1 $1|sort -n -k 1 |awk '{ printf "%.3f Mb \t%s\n", (0+$1)/1024.0/1024.0, $0 }' -/

anonymous
()

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

vitroot ★★
()
Ответ на: комментарий от anonymous

>ls -lr $1|sort -n -k 5 |awk '{ printf "%.3f Mb \t%s\n", (0+$5)/1024.0/1024.0, $0 }' -

Почему не  ls -lrSh  ?

Ладно, предположим не только для GNU/Linux, тогда вот такое:

ls -lr $1 | sort -n -k 5 |awk '{ $5=sprintf("%.3fMb", (0+$5)/1024.0/1024.0); print }'

sdio ★★★★★
()

Статья никакая, примеры УГ, пропускать на главную глупо.

sdio ★★★★★
()

>К примеру, вы хотите знать, сколько файлов в текущем каталоге. Можно скомандовать: ls | wc -l

ой, оно же и директории посчитает

>ps -eo user,pcpu,pid,cmd | sort -r -k2 | head -6

по CPU: ps --cols=1000 --sort='-vsz,uid,pgid,ppid,pid' -e -o user,pid,ppid,pgid,stime,stat,wchan,time,pcpu,pmem,vsz,rss,sz,args | sed 's/^/ /' | less

по памяти: ps --cols=1000 --sort='-vsz,uid,pgid,ppid,pid' -e -o user,pid,ppid,pgid,stime,stat,wchan,time,pcpu,pmem,vsz,rss,sz,args | sed 's/^/ /' | less

>cat /etc/passwd | sort

sort /etc/passwd

>cat /etc/passwd | sort | cut -d":" -f1

sed -e 's/:.*//' /etc/passwd
awk '{FS=":"}{print $1}' /etc/passwd

>for f in *.php; do cp $f $f.bkp; done

у меня такая беда используется:

rename.pl:
#!/usr/bin/perl
$op = shift or die "Usage: rename expr [files]\n";
chomp(@ARGV = <STDIN>) unless @ARGV;
for ( @ARGV )
{
  $was = $_;
  eval $op;
  die $@ if $@;
  rename ( $was, $_ ) unless $was eq $_;
}

borisych ★★★★★
()
Ответ на: комментарий от borisych

то есть по CPU:

  ps --cols=1000 --sort='-%cpu,uid,pgid,ppid,pid' -e \
     -o user,pid,ppid,pgid,stime,stat,wchan,time,pcpu,pmem,vsz,rss,sz,args |
     sed 's/^/ /' | less

borisych ★★★★★
()
Ответ на: комментарий от anonymous

> find ./ -type d -exec chmod 775 {} \;

В текущей директории рекурсивно сменить разрешения на все директории

> find ./ -type f -exec chmod 664 {} \;

то же для файлов

anonymous
()
Ответ на: комментарий от anonymous

нужно строчку на перле паписать? по теме: автор свое поверхностное знание командных утилит нивелирует при помощи awk, cat, sort

borisych ★★★★★
()

кстати по делу:
очень часто новички задаются вопросом - как в -exec find'а выполнить не одну а несколько комманд. выход прост:

find . -type f -exec sh -c "echo '{}' | iconv -f cp1251 -t utf8 > '{}'.utf8 && mv '{}'.utf8 '{}'" \;

Somewho ★★
()
Ответ на: комментарий от Pavval

> Простенько:
> find -name .svn -exec rm -rf '{}' \;

Ещё проще:
svn export <uri>
;)

Хотя иногда да, по ошибке заливал на хостинги .svn-каталоги...

BTW, твой вариант отработает, но будет много криков по поводу несуществующих каталогов/файлов .svn/*
Чтобы нормально отработало:


find -depth -name .svn -exec rm -rf '{}' \;

Slavaz ★★★★★
()

Тогда уже и я выскажусь.
Чистим временные каталоги, созданные при сборке портов на FreeBSD (вместо муторного 'make clean'):

%sudo find /usr/ports -depth -name "work" -exec rm -rfv '{}' \;

soko1 ★★★★★
()
Ответ на: комментарий от Slavaz

А чем плохи каталоги .svn на хостинге? форбид их в конфигах апача и все зато обновление происходит лучше

anonymous
()

Добый день, уважаемые!
По возможности просьба оценить потенциальные слабые места скриптов, а они есть...
---
...
tar cf - . | (cd /usr/backups/; tar xfp -)
...
Вот вариант однострочника, создающий архив на удаленном сервере:
...
tar cf - . | ssh smith@remote.server tar xfp - -C /usr/backup/smith
---

а кто будет контр суммы проверять (типа MD5 etc) и ошибки на ходу обрабатывать...

WBR

anonymous
()
Ответ на: комментарий от Somewho

>кстати по делу: >очень часто новички задаются вопросом - как в -exec find'а выполнить не одну а несколько комманд. выход прост:

>find . -type f -exec sh -c "echo '{}' | iconv -f cp1251 -t utf8 > '{}'.utf8 && mv '{}'.utf8 '{}'" \;

можно просто несколько раз использовать -exec

find . -exec echo {} \; -exec echo {} \;

logx
()

chmod -R a+rX directory

chmod +X устанавливает флаг x для u,g,o,a (как указано), если он стоит хотя бы для кого-нибудь (т.е. owner-executable-only => a+x, но текстовый файл a+x не получит).

anonymous
()
Ответ на: комментарий от anonymous

ну как бы лишний трафик гонять... особенно если картинки. Не критично, в принципе, просто досадная неприятность и некрасивость :) Особенно если сайт сдаётся "под ключ".

Slavaz ★★★★★
()
Ответ на: комментарий от anonymous

>Добый день, уважаемые!
>По возможности просьба оценить потенциальные слабые места скриптов, >а они есть...
>---
>...
>tar cf - . | (cd /usr/backups/; tar xfp -) 

если в системе есть полноценная cpio, то следует навсегда забыть конструкцию вида

    tar cf - . | ( cd ...; tar xf - )

как потенциально опасную. Рано или поздно по ошибке в случае `pwd`=...
получите полную потерю всего поддерева ;)

Вот правильное заклинание для копирования в пределах одного хоста:

    find . -depth -local | cpio -pdmv ...

причем, вместо точки после find лучше ставить имена подкаталогов,
именно они и появятся в ...

vsv

anonymous
()
Ответ на: комментарий от logx

>можно просто несколько раз использовать -exec

>find . -exec echo {} \; -exec echo {} \;


а чо с if делать?

Somewho ★★
()

замена which и вообще полезняшка

#!/bin/sh
#
# Печать полного имени команды, найденной в $PATH
#
# За основу взята идея из книги:
#
#       Баурн С.
#       Операционная система UNIX: пер. с англ.-М.,
#       Мир, 1986.
#       стр.258

# пользуйтесь все кому не лень, vsv (тот самый)

case $# in
0)
        IFS=: set $PATH
        for i in $@
        do
		if test -d $i -a -x $i
		then
                	echo $i
		else
			echo $i '(BAD)'
		fi
        done
        ;;

*)
        case $1 in
        -v)     v=y; shift;;
        -*)     echo "Usage: $0 [ -v | -t ] [ commands ]"; exit 1;;
        *)      v='';;
        esac
        for j do
                for i in `echo $PATH | sed 's/:/ /g'`
                do      for k in $i/$j
                        do
                                if test -f $k
                                then    
                                        if test -x $k
                                        then    echo $k
                                        else    if test "$v" = y
                                                then
                                                        echo $k '(NO_EXEC)'
                                                fi
                                        fi
                                fi
                        done
                done
        done
        ;;

esac

anonymous
()
Ответ на: замена which и вообще полезняшка от anonymous

Забыл - замена which называется path и обычно помещается
в /usr/local/bin/path ;)

примеры использования -

path (без аргументов просто печатает в столбик $PATH)

path gcc    (посмотреть а какие еще есть gcc ;)
path -v gcc (посмотреть, почему вызывается не пойми что ;)

vsv


anonymous
()
Ответ на: комментарий от Slavaz

>ну как бы лишний трафик гонять... особенно если картинки. Не критично, в принципе, просто досадная неприятность и некрасивость :) Особенно если сайт сдаётся "под ключ".

Насчет лишний трабик - наоборот - изменения только, а не экспортом все

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

anonymous
()

init 0 выключает комп :)

anonymous
()
Ответ на: комментарий от anonymous

в принципе это не скрипт, да

anonymous
()
Ответ на: комментарий от unC0Rr

>portsclean --workclean

Ясен перец что специальными программами для работы с портами можно выполнить сию операцию, но тут речь не о всяких portupgrade, а о том что можно сделать быстро и легко штатными средствами.

soko1 ★★★★★
()
Ответ на: комментарий от anonymous

>"startx -- :1" часто использую для запуска 2-го X-сервера (из под рута :)

При чём тут root? startx это скрипт который вызывает xinit, кормя ему ~/.xinitrc пользователя.

soko1 ★★★★★
()

самый полезный консольный скрипт это

echo test... test... test.. | perl !@#$%^?* (и далее по тексту)

anonymous
()

Часто юзаю find . -maxdepth 1 -type d -exec du -sh '{}' \;

Выводит полный размер директорий, находящихся в текущей.

SilentLexx
()
Ответ на: комментарий от soko1

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

unC0Rr ★★★★★
()

find . -iname '*.ogg' -exec sh -c "echo \"{}\" && sox \"{}\" tmp.ogg vol 1.7 && mv tmp.ogg \"{}\"" \;

Увеличивает громкость всех огогошек в текущей папке.

Werehuman ★★
()

I=0 && while [ $I -lt 99 ]; do I=$(mpc | head -n 2 | tail -n 1 | awk {'print $4'} | tr -d '[:punct:]'); sleep 1; done && mpc stop && shutdown -h now

Ждет, когда доиграется текущая песня в mpd, после чего вырубает машину.

Werehuman ★★
()

Конвертим все теги mp3-файлов в текущем каталоге с быдло-cp1251 на ПравоСлавный unicode (необходим mp3unicode!):

%find . -name "*.mp3" -exec mp3unicode –source-encoding windows-1251 –id3v1-encoding none –id3v2-encoding unicode {} \;

soko1 ★★★★★
()

Чистим логи:

for i in `find /var/log/* -type f`; do :>$i; done

Можно было бы конечно и одним find'ом отделаться, но что-то там у меня с конструкцией ":>" не получается. Экранировать пробовал - не получилось. С удовольствием просмотрю как упросить пример (без использования for).

soko1 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.