BASH Tips part 1. маленькие подсказки. скрипты linux консоли для себя. linux bash shell


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;» можно подставлять любые операции с файлами и их именами. Очень удобно.
============================================
bash и случайные пароли:

head -c9 /dev/random | uuencode -m - | sed -n '2s/=*$//;2p'

генерирует случайный пароль из 12 символов.
Еще один вариант:

tr -c -d 'a-zA-Z0-9' < /dev/urandom | head -c 12;echo;

============================================
Нестандартный способ почесать левое ухо правой ногой:

#!/bin/sh
# Сменить кодировку всех файлов в директории:
# переименовываем все 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’ы
======================================