ebook-cli - gerencia livros digitais entre PC e leitores ebooks
Publicado por Pedro Fernandes (última atualização em 19/04/2021)
[ Hits: 1.451 ]
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 de backup em um case USB
Configurar usuarios samba na boa sem dor de cabeça em modo texto
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
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
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)