Skip to content

Instantly share code, notes, and snippets.

@skirl
Created August 21, 2016 08:43
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save skirl/3dd0725a65d0d02d65885ae80263237d to your computer and use it in GitHub Desktop.
Save skirl/3dd0725a65d0d02d65885ae80263237d to your computer and use it in GitHub Desktop.
#!/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
@skirl
Copy link
Author

skirl commented Aug 21, 2016

screenshot from 2016-08-21 15-50-07

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment