Como copiar arquivos na linha de comando com exibição do progresso

É possível exibir o progresso da transferência dos dados, à medida em que são copiados no Linux/Unix com o uso do comando de cópia, cp?

A resposta curta é não.
Porém, através de um hack (que vou ensinar neste artigo), é possível fazer cópias de todos os arquivos de um diretório (recursivamente, se você quiser) para outro, com a exibição do progresso da cópia de cada arquivo.

rsync - exemplo de uso - captura de tela
Com o uso do alias, o cp se comporta como o comando rsync.

Se estivermos falando de arquivos muito grandes (áudio, vídeo etc.) será possível acompanhar melhor o processo de cópia na CLI (linha de comando).
Vamos ver como realizar o procedimento com o uso destas 2 ferramentas padrão em qualquer distro GNU/Linux: alias e rsync.
O comando rsync serve para fazer cópias entre diretórios locais e remotos.
Com ele é possível obter um retorno sobre a taxa de progresso da cópia de dados.
Por exemplo, para copiar todos os arquivos da pasta Documentos para /media/justincase/pendrive, use o comando assim:


rsync -ahu --progress Documentos/* /media/justincase/pendrive/

Veja o que o comando faz:

  • -a — estabelece que a transferência ocorra no nível de arquivo.
  • -hhuman readable, indica que o retorno deve ocorrer em Kb/Mb, para tornar a leitura mais fácil.
  • -uupdate, atualiza apenas os arquivos com entradas mais novas, para agilizar o processo. O rsync já faz a cópia incremental, por padrão — ou seja, verifica antes se os arquivos já existem no destino e só copia se houve atualizações.
  • --progress — finalmente, esta é a opção de exibição do progresso da execução da transferência individual da cópia.

Para adicionar recursividade, use a opção ‘-r’:


rsync -ahur --progress Documentos/* /media/justincase/pendrive/

Fique à vontade para alterar os itens da linha de comando, para que ela se encaixe às suas necessidades.
Por fim, altere a função do comando cp, no seu sistema, com o uso do alias:


alias cp="rsync -ahu --progress"

Se preferir que a função de recursividade fique em um comando separado, crie um novo alias:


alias cpr="rsync -ahur --progress"

Veja um exemplo de funcionamento do “novo” cp:


cp ~/Documentos/Documento\ digitalizado* /media/justincase/b655b449-21c6-42ca-b274-5adf9980a843/Documentos/

sending incremental file list
Documento digitalizado-1.jpg
        953.79K 100%   48.80MB/s    0:00:00 (xfr#1, to-chk=11/12)
Documento digitalizado-1.jpg.zip
        917.61K 100%   15.63MB/s    0:00:00 (xfr#2, to-chk=10/12)
Documento digitalizado-1.png
          7.40M 100%   43.27MB/s    0:00:00 (xfr#3, to-chk=9/12)
Documento digitalizado-2.jpg
        407.14K 100%    2.03MB/s    0:00:00 (xfr#4, to-chk=8/12)
Documento digitalizado-2.jpg.zip
        354.94K 100%    1.74MB/s    0:00:00 (xfr#5, to-chk=7/12)
Documento digitalizado-2.png
        483.23K 100%    2.06MB/s    0:00:00 (xfr#6, to-chk=6/12)
Documento digitalizado-3.jpg
        318.37K 100%    1.22MB/s    0:00:00 (xfr#7, to-chk=5/12)
Documento digitalizado-3.jpg.zip
        309.96K 100%    1.17MB/s    0:00:00 (xfr#8, to-chk=4/12)
Documento digitalizado-3.png
        482.62K 100%    1.64MB/s    0:00:00 (xfr#9, to-chk=3/12)
Documento digitalizado-pgto-helio20140513.pdf
        112.15K 100%  359.08kB/s    0:00:00 (xfr#10, to-chk=2/12)
Documento digitalizado.jpg
         30.82K 100%   96.76kB/s    0:00:00 (xfr#11, to-chk=1/12)
Documento digitalizado.png
          7.40M 100%   16.79MB/s    0:00:00 (xfr#12, to-chk=0/12)

Segue um exemplo de uma variação do uso do rsync, que inclui a opção ‘–info=progress2’:


rsync -ah --info=progress2 ~/Documentos/Documento\ digitalizado* /media/justincase/b655b449-21c6-42ca-b274-5adf9980a843/Documentos/

         19.16M 100%  192.03MB/s    0:00:00 (xfr#12, to-chk=0/12)

Neste caso, os dados sobre o progresso se referem à tarefa toda e não apenas a cada arquivo individualmente.
Você pode criar um alias para este modo de operação, se quiser.

Como instalar a interface de linha de comando do WordPress

Alguns usuários podem ter utilidade para uma interface de linha de comando, para realizar atividades administrativas relacionadas ao WordPress.
Para estes, existe o wp-cli — WordPress Command Line Interface, ou “interface de linha de comando do WordPress”.

Sua instalação é simples e leva menos de 30 segundos (verdade!).
Veja quais são os prerequisitos para baixar, instalar e usar o wp-cli:

  1. Ambiente UNIX-like, o que inclui o OSX, sua distro Linux favorita, FreeBSD e Cygwin (para usuários Windows). No ambiente Windows, há suporte limitado do aplicativo, mas é possível usá-lo.
  2. PHP — a versão 5.3.29 é requerida, mas as atuais distribuições GNU/Linux já estão usando versões superiores à 7.0.
  3. WordPress 3.7 ou superior.

Por fim, use o comando wget (ou o curl) para fazer o download do wp-cli.phar:


wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

Se preferir usar o curl, faça assim:


curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar

Verifique se aplicativo já está funcionando adequadamente:


php wp-cli.phar --info

PHP binary: /usr/bin/php7.0
PHP version:    7.0.19-1
php.ini used:   /etc/php/7.0/cli/php.ini
WP-CLI root dir:    phar://wp-cli.phar
WP-CLI vendor dir:  phar://wp-cli.phar/vendor
WP_CLI phar path:   /home/apps
WP-CLI packages dir:    
WP-CLI global config:   
WP-CLI project config:  
WP-CLI version: 1.3.0

Para tornar o uso do aplicativo mais simplificado, vamos torná-lo executável:


chmod +x wp-cli.phar 

… e movê-lo para um diretório mais apropriado.


sudo mv wp-cli.phar /usr/local/bin/wp

Agora já será possível executá-lo, sem digitar “PHP” no começo:


wp --info

PHP binary: /usr/bin/php7.0
PHP version:    7.0.19-1
php.ini used:   /etc/php/7.0/cli/php.ini
WP-CLI root dir:    phar://wp-cli.phar
WP-CLI vendor dir:  phar://wp-cli.phar/vendor
WP_CLI phar path:   /home/apps
WP-CLI packages dir:    
WP-CLI global config:   
WP-CLI project config:  
WP-CLI version: 1.3.0

Se preferir, na hora de baixar o programa, é possível optar pela versão nightly (a versão dos desenvolvedores). Ela tem os recursos mais atuais, porém é menos testada do que a versão estável.


wget https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli-nightly.phar

Feito o download, basta repetir os procedimentos acima — tendo o cuidado de trocar o nome da versão estável pelo da nightly.


Sempre que quiser atualizar o wp-cli, use a opção ‘update’:


sudo wp cli update
[sudo] senha para justincase: 
Success: WP-CLI is at the latest version.

Se quiser passar a usar a versão nightly, é possível fazer a troca também através do ‘update’. Veja:


sudo wp cli update --nightly

Como configuração adicional, torne o aplicativo amigável ao recurso de autocompletar:


wget https://raw.githubusercontent.com/wp-cli/wp-cli/master/utils/wp-completion.bash

Use o source, para incluir o recurso no BASH, inclua a seguinte linha no seu .bashrc:


source /caminho/para/wp-completion.bash 

… ou seja, se este arquivo estiver no seu diretório home, use “source ~/wp-completion.bash” (sem as aspas).
Para que a alteração tenha efeito imediato, rode o comando:


source ~/.bash_profile

Agora, é só usar!

Assine este site

Todo dia eu aprendo alguma coisa nova sobre administração de servidores, WordPress, bancos de dados, Android etc.
Desde o começo, este site existe para compartilhar o que sei com outras pessoas.
Se quiser ser avisado(a) quando houver post novo no blog, inscreva-se abaixo!

Referências

https://make.wordpress.org/cli/handbook/installing/.
Leia mais sobre WordPress, neste site.

Como remover o GNOME do Debian e instalar outro desktop gráfico

Se você não gosta do GNOME e prefere usar outro ambiente ou desktop gráfico, há um método muito simples para remover e, se quiser, instalar outro desktop que você goste mais.
O GNOME é, atualmente, o desktop gráfico padrão de distribuições importantes, como o Fedora, o Debian e o Ubuntu.
Mas, no mundo do software livre, ninguém é obrigado a usar ou gostar de nada.
Neste post, vou mostrar:

  • Como remover o GNOME totalmente e deixar o seu desktop apenas com a interface texto (CLI).
  • Opcionalmente, como escolher e instalar outro ambiente gráfico.

Devo advertir que os meus exemplos rodaram bem em uma máquina com conexão Ethernet. Você pode ficar sem conexão, se estiver dependendo de uma placa de rede Wi-Fi/Wireless com suporte precário por parte do fabricante.


Comece por programar o sistema para iniciar na CLI:


systemctl set-default multi-user.target

Leia mais sobre como usar o systemctl para configurar o Linux para iniciar na CLI ou GUI.
Agora reinicie o computador:


systemctl reboot

Quando o sistema voltar autentique-se (de preferência como root) e prossiga com o comando tasksel:


tasksel remove gnome-desktop

debian remover gnome
O trabalho de remoção do GNOME, a esta altura, foi concluído.

Como instalar um outro ambiente desktop gráfico no Debian

Se você quiser, pode usar o mesmo tasksel para selecionar outro desktop gráfico para instalação no seu sistema:


tasksel

tasksel seleciona ambiente gráfico
Como você pode ver, na tela do tasksel, é possível escolher mais de um ambiente gráfico para instalação.
Ao optar por instalar um destes desktop gráficos, não se esqueça de reajustar o padrão de volta para o ambiente gráfico:


systemctl set-default graphic.target

Como desativar/ativar o modo gráfico no Linux com o systemd

Você pode usar o systemd e seu comando systemctl para informar o sistema se quer usar sempre a interface gráfica ou apenas a de linha de comando.
O recurso permite a opção, sem desinstalar absolutamente nada e é facilmente reversível, como irei mostrar.
Com todos as críticas que se possa ter ao systemd — e algumas delas são muito justas — temos que reconhecer que trouxe algumas comodidades e a uniformização de alguns procedimentos.
O que vou descrever, neste artigo, foi testado no Fedora 26 Workstation — mas é aplicável em qualquer outra distro que faça uso do systemd.

Use o systemctl para determinar a interface padrão no seu sistema

Você pode usar o comando systemctl para gerenciar a interface padrão — fazendo a troca entre GUI (modo gráfico) e CLI (modo texto).
Para ver qual é o padrão, neste momento, use o comando assim:


systemctl get-default 

graphical.target

O resultado “graphical.target” indica que a GUI é a interface padrão (no meu sistema). Se fosse a CLI, o get-default iria resultar em “multi-user.target”


Use a caixa de busca do site para localizar mais posts sobre o systemd.
fedora systemd systemctl
Para mudar a interface padrão para o modo texto, na próxima inicialização do sistema, use o set-default:


systemctl set-default multi-user.target

Created symlink /etc/systemd/system/default.target → /lib/systemd/system/multi-user.target.

Este comando pede autenticação de administrador do sistema e só terá efeito após o reboot.
Você reiniciar o sistema com o próprio systemctl:


systemctl reboot

fedora systemd cli systemctl
Para desfazer o procedimento – e voltar a usar a interface gráfica como padrão – use o seguinte comando:


systemctl set-default graphical.target

Removed /etc/systemd/system/default.target.
Created symlink /etc/systemd/system/default.target → /lib/systemd/system/graphical.target.

É simples assim. 😉

Como personalizar o prompt da linha de comando no UNIX/Linux — parte 3

Neste texto vou mostrar como é fácil aplicar cores às informações exibidas no prompt da linha de comando do seu terminal.
Esta é a terceira parte de uma série de artigos sobre como configurar o prompt do seu emulador de terminal e serve para todos os Linux e UNIX (o que inclui os BSD e o MacOS), desde que estejam usando o Bash como emulador — por causa disto, talvez dê para incluir o Windows também nesta história.
Como, neste momento, não tenho um Mac em mãos, só pude testar os exemplos dados no Linux (Fedora 25, Debian 9 e OpenSUSE Tumbleweed).
Se você tiver alguma dúvida, durante a leitura, dê uma olhada nos links ou nos outros artigos (parte 1 e parte 2) desta série — tenho certeza de que a resposta estará em um destes lugares.

A tabela de cores

Use a relação de códigos de efeitos e cores, abaixo, para alterar os exemplos de prompt.

  • 0 —  efeito nenhum
  • 1 —  efeito negrito ou cor mais forte. Transforma a cor preta em cinza em alguns terminais
  • 2 —  efeito esmaecido ou mais fraco. Transforma a cor branca em cinza em alguns terminais
  • 3 —  efeito itálico
  • 4 —  efeito sublinhado
  • 7 —  efeito de inversão das cores
  • No tempo dos monitores monocromáticos, em fósforo, os efeitos eram muito úteis para ajudar a diferenciar tipos de arquivos e tornar mais legíveis os textos de interação com os usuários em scripts.
    Segue a lista de cores de frente ou foreground:

  • 30 —  preto
  • 31 —  vermelho
  • 32 —  verde
  • 33 —  amarelo
  • 34 —  azul
  • 35 —  púrpura
  • 36 —  ciano
  • 37 —  branco
  • Segue a lista de cores de fundo ou background:

  • 40 —  preto
  • 41 —  vermelho
  • 42 —  verde
  • 43 —  amarelo
  • 44 —  azul
  • 45 —  púrpura
  • 46 —  ciano
  • 47 —  branco

Os primeiros códigos (referentes aos efeitos) não irão funcionar em todos os emuladores de terminal. Portanto, não espere muito deles.
Você também pode encontrar uma tabela de cores no site do Mewbie: http://www.mewbies.com/geek_fun_files/color_scripts/color_scripts_codes.png.
ansi color codes table

Experimente as cores

As relações de cores ANSI podem ser usados em várias ocasiões. Quando estiver fazendo um script, na maioria das linguagens é possível colorir o texto de saída, para interagir com o seu usuário.
Você pode usar este código Bash, para experimentar as cores e os efeitos dados acima:

# as letras do texto na cor ciano ou cyan
echo -e "\e[36mQue cor é esta?"

Se quiser alterar apenas a cor de fundo…

# cor de fundo vermelho
echo -e "\e[41mQue cor é esta?"

Para aplicar o efeito negrito:

# vermelho forte
echo -e "\e[1;31mQue cor é esta?"

Aplique o efeito itálico; cor de frente ciano; cor de fundo amarelo:

echo -e "\e[3;36;43mQue cor é esta?"

Eu sei que dá para ficar brincando horas com isso aí… mas a gente precisa voltar a falar do command prompt.

Como aplicar cores ao prompt da linha de comando

Baseado nos exemplos dos artigos anteriores, aplique as cores, inserindo um dos códigos dos exemplos acima, tal como destacado abaixo:

PS1='\[\e[3;36m\][\d, \T]\n\[\e[0;33m\]\u@\h\[\e[1;36m\][ \w ] '

Note que a diferença é que o código de cores do PS1 precisa estar entre os caracteres “ \[\e[ ” e “ \] “.
Sinta-se à vontade para compartilhar, nos comentários, como você configurou o seu prompt!

Referências

http://www.mewbies.com/acute_terminal_fun_08_get_colorized_on_the_terminal.htm#color_scripts.
https://en.wikipedia.org/wiki/ANSI_escape_code#Colors.