LINUX.ORG.RU

151
Всего сообщений: 2680

md5 для каждого файла из find в файл рядом

Доброго всем времени. Помогите пожалуйста, нужно подсчитать md5 для каждого файла в директориях, соответствующего условию (размер, возм. - дата), и поместить ее рядом с исходным файлом в файл с именем «имя_файла.md5». Пытался делать так, но не работает:

find /dir/dir -type f -size 1M -exec md5sum {} > "{}.md5" \;

 , ,

Wolf_46 ()

bash оптимизация изображений

Привет! Есть скриптик, если указать в INPUT директорию, к примеру, /usr/share/nginx - скрипт обработает все подкаталоги и оптимизирует все изображения, НО, он их помещает в папку output

Убирая соответствующую строчку (чтобы не записывало в output), ничего не обрабатывается

Просьба помочь с правкой скрипта

Цель: чтобы скрипт обрабатывал подкаталоги и заменял старые изображения новыми, оптимизированными, не перемещая их в отдельную папку output

#!/bin/bash

PROGNAME=${0##*/}
INPUT=''
QUIET='0'
NOSTATS='0'
max_input_size=0
max_output_size=0

usage()
{
  cat <<EO
Usage: $PROGNAME [options]
Script to optimize JPG and PNG images in a directory.
Options:
EO
cat <<EO | column -s\& -t
	-h, --help  	   & shows this help
	-q, --quiet 	   & disables output
	-i, --input [dir]  & specify input directory (current directory by default)
	-o, --output [dir] & specify output directory ("output" by default)
	-ns, --no-stats    & no stats at the end
EO
}

# $1: input image
# $2: output image 
optimize_image()
{
	input_file_size=$(stat -c%s "$1")
	max_input_size=$(expr $max_input_size + $input_file_size)

	if [ "${1##*.}" = "png" ]; then
		optipng -o1 -clobber -quiet $1 -out $2
		pngcrush -q -rem alla -reduce $1 $2 >/dev/null
	fi
	if [ "${1##*.}" = "jpg" -o "${1##*.}" = "jpeg" ]; then
		jpegtran -copy none -progressive $1 > $2
	fi

	output_file_size=$(stat -c%s "$2")
	max_output_size=$(expr $max_output_size + $output_file_size)
}

get_max_file_length()
{
	local maxlength=0

	IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT)

	for CURRENT_IMAGE in $IMAGES; do
		filename=$(basename "$CURRENT_IMAGE")
		if [[ ${#filename} -gt $maxlength ]]; then
			maxlength=${#filename}
		fi
	done

	echo "$maxlength"	
}

main()
{
	# If $INPUT is empty, then we use current directory
	if [[ "$INPUT" == "" ]]; then
		INPUT=$(pwd)
	fi

	# If $OUTPUT is empty, then we use the directory "output" in the current directory
	if [[ "$OUTPUT" == "" ]]; then
		OUTPUT=$(pwd)/output
	fi

	# We create the output directory
	mkdir -p $OUTPUT

	# To avoid some troubles with filename with spaces, we store the current IFS (Internal File Separator)...
	SAVEIFS=$IFS
	# ...and we set a new one
	IFS=$(echo -en "\n\b")

	max_filelength=`get_max_file_length`
	pad=$(printf '%0.1s' "."{1..600})
	sDone=' [ DONE ]'
	linelength=$(expr $max_filelength + ${#sDone} + 5)

	# Search of all jpg/jpeg/png in $INPUT
	# We remove images from $OUTPUT if $OUTPUT is a subdirectory of $INPUT
	IMAGES=$(find $INPUT -regextype posix-extended -regex '.*\.(jpg|jpeg|png)' | grep -v $OUTPUT)

	if [ "$QUIET" == "0" ]; then
		echo --- Optimizing $INPUT ---
		echo
	fi
	for CURRENT_IMAGE in $IMAGES; do
		filename=$(basename $CURRENT_IMAGE)
		if [ "$QUIET" == "0" ]; then
		    printf '%s ' "$filename"
		    printf '%*.*s' 0 $((linelength - ${#filename} - ${#sDone} )) "$pad"
		fi

		optimize_image $CURRENT_IMAGE $OUTPUT/$filename

		if [ "$QUIET" == "0" ]; then
		    printf '%s\n' "$sDone"
		fi
	done

	# we restore the saved IFS
	IFS=$SAVEIFS

	if [ "$NOSTATS" == "0" -a "$QUIET" == "0" ]; then
		echo
		echo "Input: " $(human_readable_filesize $max_input_size)
		echo "Output: " $(human_readable_filesize $max_output_size)
		space_saved=$(expr $max_input_size - $max_output_size)
		echo "Space save: " $(human_readable_filesize $space_saved)
	fi
}

human_readable_filesize()
{
echo -n $1 | awk 'function human(x) {
     s=" b  Kb Mb Gb Tb"
     while (x>=1024 && length(s)>1) 
           {x/=1024; s=substr(s,4)}
     s=substr(s,1,4)
     xf=(s==" b ")?"%5d   ":"%.2f"
     return sprintf( xf"%s", x, s)
  }
  {gsub(/^[0-9]+/, human($1)); print}'
}

SHORTOPTS="h,i:,o:,q,s"
LONGOPTS="help,input:,output:,quiet,no-stats"
ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@")

eval set -- "$ARGS"
while true; do
	case $1 in
		-h|--help)
			usage
			exit 0
			;;
		-i|--input)
			shift
			INPUT=$1
			;;
		-o|--output)
			shift
			OUTPUT=$1
			;;
		-q|--quiet)
			QUIET='1'
			;;
		-s|--no-stats)
			NOSTATS='1'
			;;
		--)
			shift
			break
			;;
		*)
			shift
			break
			;;
	esac
	shift
done

main

 

momi ()

Скрипт - сумма памяти потребляемой стеком LAMP

Задача: Написать bash-скрипт который вернет суммарный объем памяти, потребляемый стеком LAMP в данный момент. Есть подопытный сервер: Centos 7.5, Apache, Mariadb, PHP, phpmyadmin.

Опыта почти нет. Гуглю. Буду благодарен за любые подсказки: команды, ключи.

Вывод скрипта должен выглядеть табличкой с колонками и Итого. PID | CMD | KiB Mem

Ещё не понятно какие процессы относятся к стеку LAMP. Вижу процессы httpd (Apache), mysqld (Mariadb). PHP и phpmyadmin как себя проявляют?

# ps -A | grep httpd
 1013 ?        00:00:00 httpd
 1380 ?        00:00:00 httpd
 1381 ?        00:00:00 httpd
 1382 ?        00:00:00 httpd
 1383 ?        00:00:00 httpd
 1384 ?        00:00:00 httpd
 1422 ?        00:00:00 httpd
 1426 ?        00:00:00 httpd
 1427 ?        00:00:00 httpd
 1428 ?        00:00:00 httpd
 1429 ?        00:00:00 httpd
# ps -A | grep mysqld
 1096 ?        00:00:00 mysqld_safe
 1303 ?        00:00:01 mysqld

Каких репозиториев надо подключить, чтобы в Centos memstat установить?

 ,

GoKerze ()

.bashrc

Создаю нового польователя:

useradd testuser
cp -r .ssh /home/testuser/.ssh
cp .bashrc /home/testuser/.bashrc
usermod -s /bin/bash testuser
chown -R testuser:testuser /home/testuser

Подключаюсь юзерoм к серваку и попадаю в bash, но такой как будто не выполняется .bashrc. Сужу об этом просто по виду приглашения. Если выполнить теперь от пользователя в коносле bash то все становится норм. Почему так?

 , , ,

Suntechnic ()

Запустить процесс, а потом его найти и убить

Суть описана в заголовке. Проблема, как вы уже догадались, в том, что процесс может успешно сдохнуть сам. Сейчас я просто беру pid процесса и засовываю его в файл. Потом делаю kill. И это - ужасно. Демона из него делать не нужно. По идее надо просто чистить файл с pid, если процесс сдох. Но как это сделать, я что-то не догоняю. Если вынести процесс в отдельный скрипт (в котором чистить файл после завершения) то при запуске получишь pid скрипта, а он - не нужен.
Пример

#run.sh
mycoolprocess &
PID=$!
echo $PID > my.pid

#stop.sh
kill $(cat my.pid)
>my.pid

upd: решено через еще один скрипт и убийство этого самого скрипта с потомками.

 

crutch_master ()

Одномерный массив в awk

Всем доброго времени суток.

изучаю bash, столкнулся со следующей проблемой: выгрепливаю из логов информацию такого вида

Abdullaev 08 66
Abdullaev 09 19
Abdullaev 10 87
Abdullaev 11 122
Abdullaev 12 224
Abdullaev 13 132
Abdullaev 14 125
Abdullaev 15 114
AIsaev 07 57
AIsaev 08 130
AIsaev 09 258
AIsaev 10 208
AIsaev 11 237
AIsaev 12 171
AIsaev 13 173
AIsaev 14 205

где первый столбец это логин, второй - номер часа и третий - кол-во запросов. Задача всю эту инфу поместить в некую горизонтально ориентированную таблицу вида

Пользователь | 00 | 01 | 02 | 03 | 04 | ... | 11 | 12 | 13 | 14 | 15 | 16 | ..... | 23 |

ATerrova | | | | | | |149| 41 | |211| 26 | | | | (ну условно говоря)

как я представляю себе это в своём мире чайника awk -F " " 'BEGIN {hour[25]=0} {if (hour[24]==0) {hour[24]=$1; hour[$2]=$3} else { if ($1==hour[24]) {hour[$2]=$3} if ($1!=hour[24]) {print hour; hour[24]=0} } } END {print hour}'

но понятно что ни фига это не работает.

И тут просьба к знатокам, подопните в нужную сторону, куда копать? а то что-то я совсем запутался. Или же сам подход в принципе не верен? Буду благодарен за любые советы.

 ,

De_Archangel ()

чётные и нечётные дни в cron

привет all.

возникла неопределённая грабля с расписанием, решал задачу: по чётным и не чётным дням запуск скрипта с параметрами.

решил так:

#mins hours days months day_of_the_week 02 0 1-30/2 * 1 ~/workroot/bks_exec.sh 1 a1 04 0 1-30/2 * 2 ~/workroot/bks_exec.sh 2 a1 06 0 1-30/2 * 3 ~/workroot/bks_exec.sh 3 a1 08 0 1-30/2 * 4 ~/workroot/bks_exec.sh 4 a1 10 0 1-30/2 * 5 ~/workroot/bks_exec.sh 5 a1 12 0 1-30/2 * 6 ~/workroot/bks_exec.sh 6 a1 14 0 1-30/2 * 0 ~/workroot/bks_exec.sh 7 a1 01 0 1-31/2 * 1 ~/workroot/bks_exec.sh 1 b1 03 0 1-31/2 * 2 ~/workroot/bks_exec.sh 2 b1 05 0 1-31/2 * 3 ~/workroot/bks_exec.sh 3 b1 07 0 1-31/2 * 4 ~/workroot/bks_exec.sh 4 b1 09 0 1-31/2 * 5 ~/workroot/bks_exec.sh 5 b1 11 0 1-31/2 * 6 ~/workroot/bks_exec.sh 6 b1 13 0 1-31/2 * 0 ~/workroot/bks_exec.sh 7 b1

сначала с минутах стояли нули, но тогда запускались сразу 14 скриптов, в скрипте не успевала срабатывать даже проверка на наличие работающего скрипта в памяти. распределил по минутам, теперь запускается случайным образом любой из них. перепробовал разные крон генераторы, ничего не подмогает. не пойму в чём соль и даже куда копать. если кто общался с такой граблей может подскажите как рулить чётность и нечётность правильно, в моём случае явно не отрабатывает..

 , , ,

feiteng ()

Как перекрасить вывод программы stdout/stderr в разные цвета?

Как правильно?
Вот мой неправильный вариант:

#!/bin/bash

GREEN='\033[1;32m'
RED='\033[1;31m'
COL='\033[0m'

command > >(echo -e "$GREEN""$(< /dev/stdin)""$COL") \
 2> >(echo -e "$RED""$(< /dev/stdin)""$COL" >&2)

 

teod0r ()

Утилита beautysh обновилась до версии 3.12

Сабж. Через почти что 5 месяцев утилита для переформатирования скриптов на bash'е обновилась с версии 3.11 до версии 3.12.

Changelog вместе со ссылками на скачивание прямо здесь: https://github.com/bemeurer/beautysh/releases .

 ,

saahriktu ()

Кончились дескрипторы. Можно починить без ребута?

Ребутать не хочу. Получилось залогиниться по ssh в голый bash, но на любые попытки вызывать внешний процесс пишет

-bash: fork: retry: Resource temporarily unavailable
Что делать? Можно на одних билтинах баша починить систему? echo 100000000000000 > /proc/sys/fs/file-max вроде как отрабатывает, но толку нет. Прочитать, сколько там было, тоже не осиливаю.

 , , ,

Moondancer ()

И что это за хрень [bash]

$ a["a-1"]="a1"
$ a["b-1"]="b1"
$ echo ${a["a-1"]}
b1

Ну что это за херня? У меня слов других нет.

 

crutch_master ()

Как узнать число ссылок на файл?

Допустим у меня есть файл FirstFF.txt и на него есть 5 ссылок. Если ввести команду ls -l, то она выведет примерно следующее:

-rw-r--r-- 5 ubuntu ubuntu 10 Jan 13 15:54 /home/ubuntu/FirstFF

Как мне записать число ссылок (в данном случае 5) в переменную?

 , , ,

YAVAY ()

Удалил ZSH, не могу вернуться к Bash

Решил удалить, не посмотрев как правильно, ZSH просто с помощью sudo apt-get remove zsh. Теперь при запуске терминала вылезает ошибка «Произошла неожиданная ошибка: Не удалось выполнить процесс-потомок «/usr/bin/zsh» (нет такого файла или каталога)».

Хотел попробовать поставить обратно zsh, чтобы снести нормально, но не могу ни из Python (нет sh модуля), ни из PHP (не знаю даже, как запустить скрипт без консоли :D), ни через .desktop файл. С .desktop вообще забавная история: Java из под себя запускает, а что-то по типу «echo 'hello, world' > /home/user/file» не хочет. Пробовал установить через Software Manager какой-нибудь другой терминал, но они, видимо, тоже хотят запускаться через ZSH - не работают. Пробовал поставить Synaptic, но он тоже отказывается запускаться. Что делать, как решить эту проблему и вернуть себе bash?

 

BacuJIuu ()

Ошибка с правами доступа.

$ ls -al
total 7820
drwx------    3 u0_a90   u0_a90        4096 Jan 11 22:07 .
drwx------    4 u0_a90   u0_a90        4096 Dec  7 00:43 ..
-rw-------    1 u0_a90   u0_a90         307 Dec 29 08:20 .bash_history
drwx------    3 u0_a90   u0_a90        4096 Jan 11 22:01 .config
-rwxrwxrwx    1 u0_a90   u0_a90     7978062 Jan 11 22:07 1.mp3
-rw-------    1 u0_a90   u0_a90         151 Jan 11 21:52 index.html             -rw-------    1 u0_a90   u0_a90         151 Jan 11 21:54 login.html
$ cat index.html
<html><head><meta HTTP-EQUIV="Pragma" CONTENT="no-cache"><script language='javascript'>parent.location="/login.htm"</script></head><body></body></html>$
$ cat 1.mp3
cat: can't open '1.mp3': Permission denied




В чем может быть проблема?

 , ,

tyamur ()

Парсер ping и tracert

Парсер на bash, который отображал бы размер первого пакета ping и ip 3 узла traceroute

 

Thomas_Oliver500 ()

UDEV, RULES, не отрабатывает скрипт!

Добрый день!

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

А вот скрипт из под правила не отрабатывает.

вот правило:

KERNEL==«sd?1», ATTRS{serial}==«ff540000.usb», ATTRS{idVendor}==«104b», ATTRS{idProduct}==«0002», ACTION==«add», RUN+=" /bin/sh /home/linaro/sc/aw.sh"

вот скрипт:

#!/bin/bash

sleep 5

sudo mv /media/linaro/DC8A-BBAE/* /mnt/yandex.disk/test2

sleep 10

sudo find /mnt/yandex.disk/test -name «*.zip» -exec mv '{}' /media/linaro/DC8A-BBAE \;

ЧЯНТД?

 , , , ,

KinRovtaz ()

Как убрать символ разделителя строк при выполнении для каждой строки файла?

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

#!/bin/sh

cat list_words.txt | while read line;
do
echo $line | RHVoice-test --profile Anna --output $line.wav
done

Пытался прикрутить:

line2=`echo $line | tr -d '\n'`
но действия не возымело.

 ,

victor79 ()

Вышел Bash 5.0

Changelog тут: https://ftp.gnu.org/gnu/bash/bash-5.0.tar.gz

Изменений тонна и мне до лампочки.

 

newsbot ()

Задать количество колонок

Как можно задать количество колонок (9) в выводе

ls -al | column -t

?
Проблема в том, что для некоторых строк с пробелами в именах создаются лишние колонки.
Как ограничить количество создаваемых столбцов?

 ,

teod0r ()

Создание загрузчика скриптом.

Ребят, прошу помочь со скриптом.

Имеется следующая строчка:

efibootmgr -d /dev/sda -p 1 -c -L 'Arch Linux' -l /vmlinuz-linux-zen -u 'initrd=intel-ucode.img initrd=initramfs-linux-zen.img root=PARTUUID=$(blkid -s PARTUUID -o value /dev/sda2) rw udev.log_priority=3 quiet i915.fastboot=1 i915.enable_guc=3'

Если я не ошибаюсь, вот этот кусок:

$(blkid -s PARTUUID -o value /dev/sda2)
должен преобразоваться в «partuuid» нужного мне раздела. Но по итогу в загрузчике это выходит так:
PARTUUID=(blkid.

Что не так, подскажите пожалуйста.

 , ,

vltsoy97 ()