Bash
Содержание
resizer.sh
#!/bin/bash imgprefix='resized' mkdir CONVERTED for i in $(ls *.jpeg) do convert -resize 600x800 $i CONVERTED/$imgprefix-$i echo "Foto $i converted to $imgprefix-$i" done
Ссылки
Работа с файлами содержащими пробелы
#!/bin/bash OLD_IFS=$IFS IFS=$(echo "") for i in $(ls *.odt) do echo "$i" done IFS=$OLD_IFS
(11:31:41) Юрий Азовцев: переопределяем переменную окружения IFS (она содержит символ - разделения слов в строке), меняем его на символ \n - перевода на новую строку - и все хокей
Загрузка файла с хоста уменьшающего скорость
#!/bin/bash #antishaper.sh for i in $(seq 1 100) do wget -c $1 & wget_pid=$! sleep 20s #ожидаем 20 секунд ps ux | grep $wget_pid | grep wget if [ $? -eq '1' ] then exit 1 fi kill $wget_pid done
Бэкапы с уделением бэкапов старше 30 дней
#!/bin/bash #backuper.sh tar -czpf $(date +%Y-%m-%d)-backup.tar.gz $1 echo "Backup Finished" period=2592000 for i in $(ls *-backup.tar.gz) do time=${i%-backup.tar.gz} file_utime=$(date --date="$time" +%s) cur_utime=$(date +%s) if [ $(($cur_utime - $file_utime)) -gt $period ] then rm $i echo "File $i deleted" fi done
Убрать теги из html
Как работает sed
sed 's/чего/на что/g' index.html
или
cat index.html | sed 's/чего/на что/g'
Задача: Есть файл index.html, содержащий текст и теги. Нужно удалить из файла все теги и оставить только голый текст.
index.html:
<p><b>Википедия</b> — свободная энциклопедия, в которой<br> <i>каждый</i> может изменить или дополнить любую статью</p>
Скрипт:
cat index.html | sed 's/<[ \=\"a-zA-Z0-9\/]*>//g'
<[a-zA-Z0-9\/]*> - означает, искать строку, начинающуюся с символа "<" и заканчивающейся ">" и любым количеством символов из набора [a-zA-Z0-9\/] между ними (* - любое кол-во символов из набора).
Замена в файле sources.list
Замена в файле /etc/apt/sources.list одной версии дистрибутива (lucid) на другую (precise).
sed 's/lucid/precise/g' /etc/apt/sources.list
Заменить в файле /etc/apt/sources.list адрес репозитория с http://security.ubuntu.com/ubuntu на ftp://repo/repository
deb http://security.ubuntu.com/ubuntu lucid-security main restricted
deb http://security.ubuntu.com/ubuntu precise-security main restricted
sed 's/lucid/precise/g' /etc/apt/sources.list | sed 's/http:\/\/security.ubuntu.com\/ubuntu/ftp:\/\/repo\/repository/g' #Не забыть заэкранировать спецсимвол "/" использующийся в URL
Преобразование текста
Есть список Mac и соответствующих IP | Нужно получить конфигурационный файл dhcpd.conf вида: |
---|---|
0A-71-91-5C-C3-93 192.168.10.5 CD-FC-BD-4C-4E-E5 192.168.10.6 E4-2C-53-4C-AB-94 192.168.10.7 9F-5B-44-F4-F4-0C 192.168.10.8 7A-62-27-8E-FC-4E 192.168.10.9 10-06-C0-A1-62-84 192.168.10.10 34-30-80-F2-7C-CF 192.168.10.11 D7-61-FB-2B-AD-A7 192.168.10.12 C0-4D-02-04-41-F7 192.168.10.13 10-BC-59-38-4A-55 192.168.10.14 87-5B-5C-47-FC-BF 192.168.10.15 CC-31-EF-4C-24-6C 192.168.10.16 |
host office-pc-05 { hardware ethernet 0A:71:91:5C:C3:93; fixed-address 192.168.10.5; } |
#!/bin/bash for i in $(cat mac-ip.txt|awk '{print $1"_"$2}') #Берем строку и заменяем в ней разделяющий слова ПРОБЕЛ на символ "_" (в дальнейшем по нему будет разрезать строку) do mac=$(echo $i|sed 's/-/:/g'|awk -F "_" '{print $1}') #Выводим строку из переменной i в поток, заменяем все символы "-" на символ ":", разбираем строку по символу "_" и берем только первое свлово ip=$(echo $i|awk -F "_" '{print $2}') #Выводим строку из переменной i в поток, разбираем строку по символу "_", берем только второе слово hostNumber=$(echo $ip|awk -F "." '{print $4}') #Выводим строку из переменной ip, разбираем строку по символу ".", берем только 4-е слово (используем его для формирования имени хоста) echo "host office-pc.$hostNumber {" >>dhcpd.conf echo "hardware ethernet $mac;" >>dhcpd.conf echo "fixed-addres $ip;" >>dhcpd.conf echo "}" >>dhcpd.conf echo "" >>dhcpd.conf done
Возможно решить данную задачу командой в одну строку. Но нету возможности фирмировать имя хоста в соответствии с IP
cat mac-ip.txt | sed 's/-/:/g' | awk '{ print "host office-pc- {\n hardware ethrenet " $1 ";\n fixed-address " $2 ";\n }"
Магия с изображениями при подготовке скриншотов
для запуска любой из команды нужно встать в каталог с файлами изображений и открыть терминал
переименовать по порядку (копирование)
ls *.png | sort > q.txt;q=1;while read LINE; do cp "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt
переименовать по порядку (перемещение)
ls *.png | sort > q.txt;q=1;while read LINE; do mv "$LINE" "image_1_$q.png";q=$(($q+1)); done < q.txt;/bin/rm q.txt
переименовать по порядку и приделать рамку серого цвета в 5 пикс.
ls *.png | sort > q.txt;q=1;while read LINE; do montage -border 5 -geometry +0+0 -compose copy -bordercolor gray "$LINE" "image_1_$q.png";/bin/rm "$LINE";echo $q;q=$(($q+1));done < q.txt;/bin/rm q.txt
Разное 1
#!/bin/bash for i in $(ls ./sites-enabled) do echo "$i" cat sites-enabled/$i | sed 's/NameVirtualHost/#NameVirtualHost/g' > /tmp/htmp cat /tmp/htmp > sites-enabled/$i done