net4me. net for me. net 4 mewww.Net4me.runet4me. net for me. net 4 me  
   
 
Рейтинг@Mail.ru
Rambler's Top100
Valid HTML 4.01 Transitional

net4me linux network and web technology


  Содержание подраздела:

Scripts - BASH Tips

Bash tips. Page 1

-------- Мои типсы для себя. -------
============================================
Сделать из нескольких pdf файлов один (объединить)
gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -sOutputFile=BPEL_lessons.pdf -f `ls Lesson??.pdf`
Можно еще и -q добавить для подавления вывода сообщений.
============================================
вариант цикла от и до:
for i in `seq $sta $sto`;
do
...
sleep 0.7s
done
============================================
Включение режима отладки в bash:
#!/bin/bash -x
or
#!/bin/bash
set -x
============================================
Переименовать все файлы в директории в нижний регистр
for x in *.log; do mv $x `echo $x | tr [A-Z] [a-z]`; done
============================================
Есть куча файлов с разветвленной структурой каталогов. 
Как проще всего переименовать все файлы и каталоги так, чтобы имена были только маленькими буквами?
Например, для всех файлов *.txt рекурсивно в данной директории это будет выглядеть где-то так:
for x in `find ./ -name "*.txt" `;do tf=`echo $x | tr [A-Z] [a-z]`; mv $x $tf ; wait; done
P.S. В качестве проверки работоспособности сначала написал так:
for x in `find ./ -name "*.txt" `;do tf=`echo $x | tr [A-Z] [a-z]`; echo $x." ----> ".$tf ;wait; done

Но в таком варианте не учитываются файлы, в именах которых есть пробелы. И получается путаница...
Поэтому, делать надо так:
find ./ -type f -print0 | while read -d '' FILE; do FILE2=`echo "$FILE"|tr [A-Z] [a-z]`; mv $FILE $FILE2; wait; done

В таком виде скрипт учитывает все файлы.
Вместо части "mv $FILE $FILE2;" можно подставлять любые операции с файлами и их именами. Очень удобно.
============================================
Для замены одного слова на другое сразу же во многих файлах можно использовать этот скрипт
perl -pi -e 's/ben-ja.ru/ben-ja.hightech.su/g' *.html
============================================
bash и случайные пароли:
head -c8 /dev/random | uuencode -m - | sed -n '2s/=*$//;2p'q
генерирует случайный пароль из 12 символов.
Еще один вариант:
tr -c -d 'a-zA-Z0-9' < /dev/urandom | head -c 12
============================================
Нестандартный способ почесать левое ухо правой ногой:
# Сменить кодировку всех файлов в директории:
# переименовываем все name.html в NAME.HTML:
for x in *.html; do mv $x `echo $x | tr [a-z] [A-Z]`; done
# копируем каждый ФАЙЛ в файл с заменой кодировки:
for x in *.HTML; do cat $x |iconv -f koi8-r -t cp1251 > `echo $x | tr [A-Z] [a-z]`;wait; done
# Удаляем старые ФАЙЛЫ за ненадобностью:
rm *.HTML
===========================================
for FIL in `ls -t $BACKUPDIR/$DBNAME-*.dmp` ;
do
        let "COUNT=$COUNT + 1";
        echo "COUNT= $COUNT FIL= $FIL"  >> $MYLOGFILE;
        if [ -e "$FIL" ] && [ "$COUNT" -gt "$COL" ] ; then
                # Очередной файл существует и при этом кол-во файлов уже больше $COL
                echo "==== Файлов больше чем $COL удаляем старые. ===" >> $MYLOGFILE;
                # Тут надо удалять каждый файл пока условие верно.
                echo "# Remove $FIL " >> $MYLOGFILE;
                rm -f $FIL 2>> $MYLOGFILE;
                wait;
        fi
done
==========================================
заметки. команда screen:

screen -ls      =list
screen -r       = подцепиться к основному
C-a d           =detach
C-a '           =(select) Prompt for a window name or number to  switch to.
C-a 0-9         = Switch to window number 0  -  9.
C-a D D     =(pow_detach) Detach and logout.
C-a h       =(hardcopy) Write a hardcopy of the current window to the file "hardcopy.n".
C-a H           =(log)Begins/ends logging of the current window to the file "screenlog.n".
C-a i   OR
C-a C-i         =(info) Show info about this window.
C-a k   OR
C-a C-k         =(kill)Destroy current window.
C-a l   OR
C-a C-l         =(redisplay)Fully refresh current window.
==========================================
вывести список файлов с полными путями.

Для bash скрипта надо список в виде:
каталог/файл3
каталог/каталог/файл1
каталог/каталог/файл2
Как сделать?

Почему-то часто незаслуженно забывается команда find:
find каталог/
всё просто.
======================================
Постоянно забываю про перекрытие вывода...
создать /dev/null:
mknod FILE c 1 3
солярка:
mknod FILE c 13 2
подавление вывода на консоль:
oesucr change-email.txt -change > /dev/null 2>&1;
======================================

Столкнулся с необходимостью перевести число из одной системы счисления в другую...
Оказалось, что с этим прекрасно справляется bc:
$ echo "ibase=2; 1001111"|bc
79
$ echo "ibase=16; F3"|bc
243
$ echo "ibase=16; FF"|bc
255
$ echo "ibase=10;obase=16; 255"|bc
FF
$ echo "ibase=16;obase=2; FF"|bc
11111111
=====
$ echo $((2#11111111))
255
$ echo $((16#FF))
255
=====
$ echo "obase=2 ; $((16#FF))"|bc
11111111
$ echo "obase=16 ; $((2#11111111))"|bc
FF
=====================================
ls /usr/bin | pr -t20 -w$COLUMNS
cat /etc/httpd.conf |grep -vE '^$^|#'| pr -t2 -w$COLUMNS
пояснение:
$COLUMNS в линуксе означает ширину терминала в символах (напр., 80 или 156)
=====================================
Подсчет количества совпадений слова во всех файлах директории.
(например, в логах аськи =) )
echo `grep -hirc 'пив' ./`|sed s/\ /\ +\ /g|bc
=====================================
Переименовать все файлы так, чтобы добавить в начало имени каждого файла какой-то текст:
было:
p100x70x60.JPG
p100x80x70 (2).JPG
p110x100x100.JPG

$ rename 's/^/kamenural_/' *.JPG
станет:
kamenural_p100x70x60.JPG
kamenural_p100x80x70 (2).JPG
kamenural_p110x100x100.JPG

$ rename 's/JPG/jpg/' *.JPG
переименует все файлы JPG в jpg
kamenural_p100x70x60.jpg
kamenural_p100x80x70 (2).jpg
kamenural_p110x100x100.jpg

Примечание:
Почему-то rename перестала работать как раньше.
То есть раньше я бы просто написал:
$ rename JPG jpg *.JPG
То есть rename ЧТО НА_ЧТО КАКИЕ_ФАЙЛЫ
Но теперь это почему-то не работает.
Теперь сплошные regexp'ы
======================================



Дополнительную информацию по командам linux вы можете найти в разделе документации
Более полную информацию по этой теме можно получить на новом сайте net4me.net