ebook-cli - gerencia livros digitais entre PC e leitores ebooks
Publicado por Pedro Fernandes (última atualização em 19/04/2021)
[ Hits: 1.723 ]
Homepage: https://github.com/PedroF37
Download 1616803194.ebook-cli (versão 2)
Gerencia livros digitais entre PC e leitores ebooks.
Funções que desempenha:
- Cria pasta chamada Biblioteca no PC e no dispositivo ebook-reader
- Copia e remove livros das pastas Biblioteca no PC e ebook-reader
- Lista conteúdo das Bibliotecas do PC e ebook-reader
- Cria pequeno arquivo de configuração na primeira vez que é rodado,
onde armazena o ponto de montagem do dispositivo (conta com que não mude),
e o local das pastas Biblioteca.
Exemplo:
/home/pedro/Biblioteca --> Pasta no PC
/run/media/pedro/Lev/Biblioteca --> Pasta no dispositivo ebook-reader
Versão 2 - Enviado por Pedro Fernandes em 26/03/2021
Changelog: Versão 0.2:
-Adicionado o tamanho dos livros, na função ListContent com: ls -sh
- Adicionada função FindPager para achar automaticamente o pager e registrar em arquivo de configuração:
(usuário não tem que entrar mais dentro do script e configurar variável PAGER)
POR FAVOR apagar arquivo $CONFIG (.ebook-cli.conf) e rodar o script para registrar $_PAGER no arquivo.
- Variável PAGER foi removida e substituida por _PAGER (para não dar problemas com PAGER do sistema)
-Quando mostra os dispositivos para escolher o ebbok-reader, não mostra mais os extras como,
ext4 (rw,nosuid,nodev,relatime..etc), mostra só /dev/sdc on /media/pedro/Lev
-Adicionado teste na função CreateFolder, pois na versão anterior, se usuário apagar o arquivo de configuração,
depois quando rodar o script de novo vai dar erro pois já tem as pastas Biblioteca criadas.
Agora função testa se tem as pastas e se tiver não faz nada e simplesmente prossegue, se não tiver então cria.
#!/bin/bash
#
#
# -------------------------------------------------------- #
#
# ebook-cli:
#
# Gerência livros digitais entre pc e
# leitores ebooks.
#
# -------------------------------------------------------- #
#
# Funções do script:
#
# -Cria pasta para biblioteca de livros
# no pc e no ebook-reader. Nome: Biblioteca
# -Lista conteúdo da biblioteca de livros
# no pc e no ebook-reader
# -Copia e remove livros das bibliotecas
# -Cria pequeno arquivo de configuração
# a primeira vez que é rodado, com registro
# de ponto de montagem do ebook-reader e
# local da biblioteca no pc e no ebook-reader.
# Só volta a criar arquivo de configuração
# se o usuário deletar o arquivo.
#
# -------------------------------------------------------- #
#
# NOTAS:
#
#
# Limitações do script nesta primeira versão:
#
#
# -Usuário tem que especificar qual paginador (less/most/more)
# quer usar na variável PAGER na secção de Variáveis Globais
#
# -Script copia e remove livros apenas entre as pastas Biblioteca
# do pc e do ebook-reader (Usuário tem que copiar manualmente
# livros para a pasta Biblioteca do pc para depois puder gerênciar
# os livros entre a pasta no pc e a pasta no ebook-reader)
#
# -O script só aceita UM dispositivo ebook-reader.
# Para usar outro dispositivo, usuário tem que deletar
# arquivo de configuração e chamar o script para criar outro.
#
# -Script conta com que dispositivo aparece na saída do
# comando mount como algo assim: (/dev/sdc on /run/media/pedro/Lev)
# (Digo isso pois não uso muitas distribuições, não sei se aparece
# assim em todas...!!)
#
# -------------------------------------------------------- #
#
# Versão:
#
# 0.1 -Inicio do script 25/11/2020
#
#
# Autor: pedro fernandes
# Email: pedrobfernandes37@gmail.com
#
#
# -------------------------------------------------------- #
### Variáveis Globais ###
### Configurado por usuário ###
# Coloque o paginador que usa aqui ex: (most|less|more)
# Coloque caminho completo ex: /usr/bin/most
PAGER=""
### Fim de configuração do usuário ###
### Daqui em diante NÃO mexa!! ###
CONFIG="${HOME}/.ebook-cli.conf" # Arquivo de configuração
PCLIBRARY="${PCLIBRARY:-${HOME}/Biblioteca}" # Pasta dos livros no pc
DEVICELIBRARY="" # Pasta dos livros no ebook-reader
DEVICE="" # Dispositivo ebook-reader
# -------------------------------------------------------- #
### Funções ###
# Chamada por trap, remove
# arquivos temporários
function RemoveTemp {
rm -f "$registry" "$listremove" \
"$listcopy" &> /dev/null
return
}
# Para apagar arquivo de configuração
# caso algo tenha dado errado
function RemoveConfig {
rm -f "$CONFIG"
return
}
function GameOver {
echo "$@" >&2
exit 1
}
function ExitSigInt {
clear
echo "Script interrompido por usuário."
echo "Terminando..."
RemoveTemp
exit 0
}
function Banner {
clear
echo -e "\t\t\t\t\t\t**************************************************"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t* ebook-cli *"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t* Gerenciador de Livros CLI *"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t* *"
echo -e "\t\t\t\t\t\t**************************************************"
return
}
# Aqui as pastas gravadas na função abaixo
# são realmente criadas. Primeiro lê do arquivo
# de configuração. Depois ignora a linha que
# começa com DEVICE, e então tenta criar as pastas.
# Se der errado quer dizer deve ter algum erro
# nas permissões.
# Nesse caso sai do script e deleta arquivo $CONFIG
function CreateFolder {
echo "Aguarde enquanto criamos as pastas"
echo "para guardar seus livros..."
if mkdir "$PCLIBRARY" &> /dev/null && \
mkdir "$DEVICELIBRARY" &> /dev/null
then
clear
echo "Pastas criadas com sucesso no seu pc e ebook-reader!!"
echo "Pastas chamam-se: Biblioteca. Pode agora passar livros"
echo "para a pasta Biblioteca do seu pc e chamar o script"
echo "para gerenciar os livros no pc e no seu ebook-reader."
echo "Para usar outro dispositivo ebook-reader, basta deletar"
echo "o arquivo $CONFIG e rodar de novo o script"
exit 0
else
clear
RemoveConfig
RemoveTemp
GameOver "Erro ao criar pastas. Revise suas permissões"
fi
}
# Aqui grava em $CONFIG as pastas onde vão ficar os livros
# Grava duas pastas: $PCLIBRARY tem a pasta no pc
# $DEVICELIBRARY tem a pasta que fica no ebook-reader
function RecordConfig {
while read line
do
if [ "${line%% *}" = "DEVICE" ]
then
DEVICE="${line##* }"
DEVICELIBRARY="${DEVICE}/Biblioteca"
#
echo "PCLIBRARY = ${PCLIBRARY}" >> "$CONFIG"
echo "DEVICELIBRARY = ${DEVICELIBRARY}" >> "$CONFIG"
CreateFolder
else
clear
RemoveConfig
RemoveTemp
GameOver "Erro!! Saindo do script."
fi
done < "$CONFIG"
}
# O fato de ter digitado número não quer
# dizer que digitou correto. Inclusive pode
# ter pressionado enter apenas e foi aceite.
function ValidChoice {
# Validamos o número escolhido
case "$number" in
"")
# Se tiver dado ENTER no case da função abaixo
# vai corresponder com todos os números.
# Não pode. Aqui pega esse caso.
clear
RemoveTemp
GameOver "Não digitou nada!! Saindo do script..."
;;
*)
# Se digitou número certo, então
# guarda em arquivo de configuração.
if grep -q "^$number" "$registry"
then
sed -n "s/^$number/DEVICE =/p" "$registry" | \
cut -d ' ' -f 1,2,5 >> "$CONFIG"
RecordConfig
else
# Não deu apenas enter (foi número)
# mas mesmo assim número não está
# certo? Sai!!
clear
RemoveTemp
GameOver "Erro!! Número digitado é incorreto. Saindo..."
fi
;;
esac
}
# Aqui escolhe o dispositivo correspondente
# que mostra na listagem da função abaixo.
function ChooseDevice {
# Dá 2 tentativas de digitar número
for try in {1..3}
do
clear
echo -e "\n\nPor favor digite o número do dispositivo"
echo -n "que corresponde ao seu ebook-reader: "
read number
case "$number" in
# Só aceita número, o resto não passa
# Mas aceita ENTER!!
*[!0-9]*)
if [ "$try" -eq 2 ]
then
clear
RemoveTemp
GameOver "Tentativas esgotadas!!"
break
fi
echo "Erro. Tente de novo"
;;
*)
# Se estamos aqui, certo ou errado
# digitou número; (ou enter!!).
break
;;
esac
done
ValidChoice
}
# Se não tiver arquivo de configuração criado
# função é chamada. Se tiver, não é chamada.
function FindDevice {
echo -e "\n\t\t\t\t\t\tNão foi encontrado arquivo de configuração"
echo -e "\t\t\t\t\t\tIremos criar um para você agora."
echo -e "\t\t\t\t\t\tEste passo é necessário apenas uma vez"
echo -ne "\n\n\t\t\t\t\t\tAperte <ENTER> para continuar: "
read enter
# Acha os dispositivos montados. Númera com o sed
# para usuário digitar o número do dispositivo.
# Podia usar o nl, cat etc... ,
# mas fica mais bonitinho de se ver na tela com o sed!!
local device="$(mount | grep -v '^[^/]' | sed '=' | \
sed 'N; s/\n/ /')"
# Cria arquivo temporário para armazenar saída
# da substituíção acima, para comparar depois
# com escolha do usuário.
local registry="$(mktemp $HOME/tempXXXXXX)"
echo "$device" >> "$registry"
clear
echo -e "Estes são os dispositivos no sistema:\n\n"
sleep 2
$PAGER "$registry"
ChooseDevice
}
function ListContent {
clear
echo "Deseja listar conteúdo de qual biblioteca?"
read -n 1 -p "1. Pc, 2. ebook-reader: " choice
case "$choice" in
1)
clear
ls "$PCLIBRARY" | $PAGER
;;
2)
clear
ls "$DEVICELIBRARY" | $PAGER
;;
*)
clear
echo "Erro!! Opção inválida."
RemoveTemp
sleep 2
;;
esac
return
}
function CopyContent {
clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear
local listcopy="$(mktemp $HOME/listcopyXXXXXX)"
ls "$source" | sed '=' | sed 'N; s/\n/: /' > $listcopy
$PAGER $listcopy
echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer copiar, um atrás do outro"
echo -n "separados por espaço: "
read books
for item in $(echo $books)
do
if grep -q "^${item}: " "$listcopy"
then
local listcopy2=$(grep "^${item}: " "$listcopy" | \
cut -d ' ' -f 2-)
#
#
echo "Copiando item ${item}..."
echo "cp ${source}/$listcopy2 $target"
cp -u "${source}/$listcopy2" "$target"
else
echo "Erro. Item ${item} não existe na lista"
echo "Logo não iremos copiar."
echo "Continuando..."
fi
done
RemoveTemp
sleep 2
return
}
function RemoveContent {
clear
echo "Os livros que se encontram na Biblioteca:"
sleep 2
clear
local listremove="$(mktemp $HOME/listremoveXXXXXX)"
ls "$target" | sed '=' | sed 'N; s/\n/: /' > $listremove
$PAGER $listremove
echo -e "\n\nPor favor digite o(s) número(s) que corresponde"
echo "ao(s) livro(s) que quer remover, um atrás do outro"
echo -n "separados por espaço: "
read books
for item in $(echo $books)
do
if grep -q "${item}: " "$listremove"
then
local listremove2=$(grep "${item}: " "$listremove" | \
cut -d ' ' -f 2-)
#
#
echo "Removendo item ${item}..."
echo "rm -f ${target}/$listremove2"
rm -f "${target}/$listremove2"
else
echo "Item $item não existe na lista."
echo "Logo não iremos remover."
echo "Continuando..."
fi
done
RemoveTemp
sleep 2
return
}
# Aqui escolhe de onde quer
# copiar livros
function ChooseCopyContent {
local source=""
local target=""
clear
echo "Deseja copiar de onde para onde?"
echo "1. pc para ebook"
echo "2. ebook para pc"
echo -en "Digite a opção: "
read -n 1 opcao
case "$opcao" in
1)
source="$PCLIBRARY"
target="$DEVICELIBRARY"
CopyContent
;;
2)
source="$DEVICELIBRARY"
target="$PCLIBRARY"
CopyContent
;;
*)
clear
echo "Erro!! Opção inválida"
sleep 2
;;
esac
return
}
# Aqui escolhe de onde quer
# remover livros
function ChooseRemoveContent {
local target=""
clear
echo "Deseja remover de onde."
echo "1. Biblioteca do pc"
echo "2. Biblioteca do Ebook-reader"
echo -en "Escolha a opção: "
read -n 1 opcao
case "$opcao" in
1)
target="$PCLIBRARY"
RemoveContent
;;
2)
target="$DEVICELIBRARY"
RemoveContent
;;
*)
clear
echo "Erro!! Opção invávida"
sleep 2
;;
esac
return
}
# Menu de apresentação e de escolha
function Menu {
while true
do
clear
Banner
echo -e "\n\t\t\t\t\t\t\tBem Vindo(a) ao ebook-cli!!\n\n"
echo -e "\t\t\t\t\t\t\tPor favor escolha o que quer fazer\n\n"
echo -e "\t\t\t\t\t\t1. Listar conteúdo das Biblotecas de livros"
echo -e "\t\t\t\t\t\t2. Copiar livros das Bibliotecas"
echo -e "\t\t\t\t\t\t3. Remover livros das Bibliotecas"
echo -e "\t\t\t\t\t\t0. Saír do script sem executar nenhuma ação\n\n\n"
echo -en "\n\n\t\t\t\t\tPor favor digite sua opção: "
read -n 1 opcao
case "$opcao" in
1)
ListContent
;;
2)
ChooseCopyContent
;;
3)
ChooseRemoveContent
;;
0)
clear
echo "Terminando script."
echo "Obrigado por usar o ebook-cli!!"
break
;;
*)
clear
RemoveTemp
GameOver "Erro!! Opção inválida. Saindo..."
break
;;
esac
done
}
# Aqui lê do arquivo de configuração
# Torna os dados do arquivo
# disponiveis para o script
function ReadConfig {
# Aqui faz backup do descritor 0 (STDIN)
exec 6<&0
exec 0< "$CONFIG"
while read line
do
# Se removendo tudo da direita em $line,
# depois do espaço sobrar:
case "${line%% *}" in
DEVICE)
# $DEVICE= Tudo o que está
# em $line menos DEVICE =
DEVICE="${line##* }"
;;
PCLIBRARY)
PCLIBRARY="${line##* }"
;;
DEVICELIBRARY)
DEVICELIBRARY="${line##* }"
;;
*)
:
;;
esac
done
# Restaura STDIN (0) para ser usado
# no script
exec 0<&6
Menu
}
# --------------------------------------------------------- #
# Começa aqui
# Limpando a sujeira
trap ExitSigInt SIGINT
trap RemoveTemp EXIT
# Testa se já tem arquivo de configuração
# Se tem chama função ReadConfig. Senão
# chama função FindDevice. Esta depois
# chama as outras.
if [ -e "$CONFIG" -a -s "$CONFIG" ]
then
ReadConfig
else
Banner
FindDevice
fi
exit $?
# --------------------------------------------------------- #
Postfix: Configurando o Gmail como Relay (moleza)
Script para Remover Ascentos em arquivos HTML
Gzipar arquivos com determinadas extensões
Cirurgia para acelerar o openSUSE em HD externo via USB
Void Server como Domain Control
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Script de montagem de chroot automatica
Atualizar Linux Mint 22.2 para 22.3 beta
Jogar games da Battle.net no Linux com Faugus Launcher
Como fazer a Instalação de aplicativos para acesso remoto ao Linux
Assisti Avatar 3: Fogo e Cinzas (4)
Conky, alerta de temperatura alta (11)









