ebook-cli - gerencia livros digitais entre PC e leitores ebooks
Publicado por Pedro Fernandes (última atualização em 19/04/2021)
[ Hits: 1.420 ]
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 $? # --------------------------------------------------------- #
Script simple backup em Fita DAT
Script para adicionar bordas às imagens de uma pasta
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Flatpak: remover runtimes não usados e pacotes
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Acessar ftp por nome ao invés de ip [RESOLVIDO] (5)
Estou com sede em aprender sobre o nosso querido Linux. (2)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta