LINUX.ORG.RU

Делюсь bash скриптом с: lsblk, mount, umount, parted, mkntfs

 , ,


1

1
  • Нравится "sudo lsblk -fm", но не удобно печатать.
  • Хочу простой способ монтировать/отмонтировать флешку.
  • Нравится "sudo gparted", но можно же скриптом :)

Скрипт писал для себя. Возможно кому-нибудь тоже будет удобен в использовании.
Буду рад новым идеям, замечаниям и комментариям.

Ссылка на GitHub: https://gist.github.com/skirl/3dd0725a65d0d02d65885ae80263237d

Добавил скриншот на GitHub: https://cloud.githubusercontent.com/assets/12707255/17836288/2a85b728-67b7-11...

#!/bin/bash

lsblk_init(){
# Смотрим подключенные устройства:
dev=( $(ls /dev/sd* -1 | cut -c6-) )
# Выбираем последнее устройство по умолчанию:
n=$((${#dev[@]}-1))
}; lsblk_init

# lsblk - показать подключенные жесткие диски и флешки:
lsblkk_k(){ sudo lsblk -o \
    TRAN,MODEL,REV,VENDOR,PARTFLAGS,SIZE,NAME,FSTYPE,MOUNTPOINT,RM,LABEL #,UUID
	}; alias kir_lsblk='lsblkk_k'; alias bk='lsblkk_k'

# Форматировать устройство в NTFS:
format_ntfs_k(){
	read -n1 -srp " Are you sure? [y/n]"
	echo
	if [[ "$REPLY" =~ ^(Y|y)$ ]]
	then
#	tput
# http://linuxcommand.org/lc3_adv_tput.php
# http://askubuntu.com/questions/366103
#/saving-more-corsor-positions-with-tput-in-bash-terminal
# http://stackoverflow.com/questions/14259311
#/set-or-change-vertical-position-of-the-cursor
		tput sc
		tput cnorm -- normal # Set the cursor to its normal state.
		read -rp " Label: " LABEL
		if [ ${#dev[$n]} = 3 ]
		then
			sudo parted --script --align optimal "/dev/${dev[$n]}" \
				mklabel msdos mkpart primary 0% 100%
			sudo mkntfs --fast -L "$LABEL" "/dev/${dev[$n]}1"
		else
			sudo mkntfs --fast -L "$LABEL" "/dev/${dev[$n]}"
		fi
		echo -e "\n Format device /dev/${dev[$n]} completed :)"
		tput civis -- invisible # Set to cursor to be invisible.
		dev=( $(ls /dev/sd* -1 | cut -c6-) )
		lsblkk_k > /tmp/lsblkk_k
	else
		echo " Cancel"
	fi
	}; alias kir_format_ntfs='format_ntfs_k'

# Извлечь и отключить питание:
lsblk_eject(){
	cd
	sudo umount $(ls /dev/sd* | grep ${dev[$n]:0:3}.) && \
	for i in $(ls /dev/sd* | grep sdb. | cut -c6-9)
	do sudo rmdir /media/k/$i
	done
	udisksctl power-off -b /dev/${dev[$n]}
	dev=( $(ls /dev/sd* -1 | cut -c6-) )
	n=$((${#dev[@]}-1))
	lsblkk_k > /tmp/lsblkk_k
	tput home
	tput ed
	cat /tmp/lsblkk_k | grep -e "─${dev[$n]}" -e " ${dev[$n]}" -e " "
	}

# Монтировать и отмонтировать:
lsblk_mounter(){
	if [ ${#dev[$n]} = 3 ]
	then # Unmount all partitions:
			cd
			sudo umount $(ls /dev/sd* | grep ${dev[$n]:0:3}.) && \
			for i in $(ls /dev/sd* | grep sdb. | cut -c6-9)
			do sudo rmdir /media/k/$i
			done
	else
		dir="$(awk -v needle="/dev/${dev[$n]}" '$1==needle {print $2}' /proc/mounts)"
		if [ -z "$dir" ]
		then
			sudo mkdir /media/k/${dev[$n]}
			sudo mount /dev/${dev[$n]} /media/k/${dev[$n]} -o uid=1000
			lsblkk_k > /tmp/lsblkk_k
			tput home
			tput ed
			cat /tmp/lsblkk_k | grep -e "─${dev[$n]}" -e " ${dev[$n]}" -e " "
			ls /media/k/${dev[$n]}
		else
			cd
			sudo umount /dev/${dev[$n]}
			sudo rmdir /media/k/${dev[$n]}
		fi
	fi
	lsblkk_k > /tmp/lsblkk_k
	}

# Показать:
lsblk_ls(){
	dir="$(awk -v needle="/dev/${dev[$n]}" '$1==needle {print $2}' /proc/mounts)"
	if [ -z "$dir" ]
	then
		lsblk_mounter
	else ls "$dir"
	fi
	}

# Октрыть устройство:
lsblk_open(){
	lsblk_ls
	dir="$(awk -v needle="/dev/${dev[$n]}" '$1==needle {print $2}' /proc/mounts)"
	cd $dir && break
	}

# Move:
lsblk_up(){ [ $n -gt 0 ] && n=$(($n-1)); }
lsblk_down(){ [ $(($n+1)) -lt ${#dev[@]} ] && n=$(($n+1)); }
lsblk_home(){ n=0; }
lsblk_end(){ n=$((${#dev[@]}-1)); }

# Main
lsblk_main(){
clear
lsblkk_k > /tmp/lsblkk_k
tput civis -- invisible # Set to cursor to be invisible.
# Это офигенный цикл он умеет понимать, что нажато на клавиатуре: и буквы, и стрелочки и т.п.!
# Источник:
# http://unix.stackexchange.com/questions/179191
#/bashscript-to-detect-right-arrow-key-being-pressed
while :; do
tput home # Move the cursor to upper left corner (0,0).
cat /tmp/lsblkk_k | grep -e "─${dev[$n]}" -e " ${dev[$n]}" -e " "
read -rsN1
tput ed # Clear from the cursor to the end of the screen.
             #:)#_ HELP
	case "$REPLY" in
	# One byte (char) cases.
	J)	lsblk_home;; #_ Home
	j)	lsblk_up;; #_ ^ Up
	k)	lsblk_down;; #_ v Down
	K)	lsblk_end;; #_ End
	o)	lsblk_open;; #_ - open device.
	l)	lsblk_ls;; #_ > Right - show files.
	m|u) lsblk_mounter;; #_ - mount or umount device.
	f)	format_ntfs_k;; #_ - format device to NTFS.
	e)	lsblk_eject;; #_ - eject.
	q)	break;; #_ Here only quit.
	$'\x0a') lsblk_open;; #_ Enter - open device.
	$'\x20') lsblk_mounter;; #_ Space - mount or umount.
	$'\x1b')    # Handle ESC sequence.
		read -rsN1
		if [[ "$REPLY" == "[" ]]; then
			read -rsN1
			case "$REPLY" in
			A) lsblk_up;; # ^ Up
			B) lsblk_down;; # v Down
			C) lsblk_ls;; # > Right
			D) :;; # < Left
			H) lsblk_home;; # Home
			F) lsblk_end;; # End
# http://stackoverflow.com/questions/192319
#/how-do-i-know-the-script-file-name-in-a-bash-script
# Help:
	*)  cat $BASH_SOURCE | grep "#\
_" | sed "s/\\t/ /g" | sed "s/).*#\
_ /) /g"
			esac
		echo
		fi;;
# Help:
	*)	cat $BASH_SOURCE | grep "#\
_" | sed "s/\\t/ /g" | sed "s/).*#\
_ /) /g"
    esac
done
tput cnorm -- normal # Set the cursor to its normal state.
# Очистить функции и переменные после работы скрипта:
# Will unset the function:
unset -f lsblk_init lsblk_eject format_ntfs_k lsblk_mounter
unset -f lsblk_ls lsblk_open lsblk_up lsblk_down lsblk_home lsblk_end
# Will unset variables:
unset i dev dir n REPLY LABEL needle
rm /tmp/lsblkk_k
};

# Запуск скрипта:
lsblk_main


На ноутбуке установлена Ubuntu. DE умеет и монтировать, и отмонтировать.
А форматировать можно и через Gparted, но мне не всегда охото отрывать руки от клавиатуры, чтобы щёлкнуть пару раз мышкой.

exfat, ntfs или fat32 пока не принципиально, при желании можно добавить всё необходимое в скрипт :)
ntfs выбрал просто для примера.

Скажите, пожалуйста, а чем systemd мне поможет отформатировать флешку?

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

Скажите, пожалуйста, а чем systemd мне поможет отформатировать флешку?

Ни чем, но нездоровые люди вспоминают её по делу и не делу (как хейтеры, так фанаты).

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

Скажите, пожалуйста, а чем systemd мне поможет отформатировать флешку?

Да никак он не поможет. EXL вообще имел ввиду что‐то неотносящееся к сабжу.

kalterfive ★★ ()
Последнее исправление: kalterfive (всего исправлений: 1)
Ответ на: комментарий от kalterfive

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

И я бы не стал добавлять сильно специфичные алиасы (функции, похожие на алиасы), повторяющие работу исходных команд, в ~/.bashrc – это нерационально.

kalterfive ★★ ()
Последнее исправление: kalterfive (всего исправлений: 1)
Ответ на: комментарий от kalterfive

Спасибо за критику.
Да, Вы правы, скрипт выполняет последовательность существующих команд. Рассмотрим пример, мне нужно отформатировать флешку LiveUSB записанную через dd. И для этого нужно набрать несколько команд или много тыкать мышкой:
1) lsblk # посмотреть под какой буквой нужная флешка или sdb, или sdc и т.п.
2) umount /dev/sdc1 # отмонтировать
3) запустить sudo gparted, sudo cfdisk или что-то другое, чтобы ещё тыкать мышкой создавать таблицу разделов и отформатировать созданные разделы.

Вот поэтому и родился скрипт, пара нажатий и всё:
kk Enter f q

А можно немного конкретики? Вы сказали:

скрипт написан слегка косо...

Что можно сделать чтобы он стал ровнее?

P.S. В ~/.bashrc добавил только:
alias kk='. ~/Dropbox/skripts/lsblk.sh'

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

это флешка или нет?

;-) Я думаю здесь сразу будет видно где котлеты и мухи флешки и жёсткие:
lsblk -o TRAN,NAME,RM
это только предположение, возможно я ошибаюсь.

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

Дело говорите) Полностью с Вами согласен:
Алиасы в этом скрипте нафиг не нужны!
И коментарии на великом и могучем - это стрёмно :-)

P.S. В своей версии скрипта уже исправил данные недоразумения.

Skirl ()