ebook-cli - gerencia livros digitais entre PC e leitores ebooks
Publicado por Pedro Fernandes (última atualização em 19/04/2021)
[ Hits: 1.669 ]
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 $?
# --------------------------------------------------------- #
del_user - cuida dos 4 passos para remover um usuário do sistema
Tabela do Campeonato Brasileiro Direto no Terminal
Shell Script básico para gerenciar usuários e bancos no MySQL ou MariaDB
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Preciso recuperar videos *.mp4 corrompidos (10)
É normal não gostar de KDE? (11)
Secure boot, artigo interessante, nada técnico. (2)









