Buscar

Dominando_o_Terminal_do_Linux

Prévia do material em texto

1
Dominando o 
Terminal do 
Linux
Um Curso Rápido e 
Descomplicado para Iniciantes
Elcio Ferreira
 elcio@visie.com.br 
2
O que é o prompt e como 
funciona 
Se você abrir o terminal em seu Ubuntu agora, deve ver 
algo parecido com isso:
O texto "elcio@skywalker:~$" é o que aparece aqui para 
mim agora. Nesse texto, "elcio" é meu nome de usuário e 
"skywalker" é o nome do meu computador (todos os 
meus computadores e tem nomes de personagens de Star 
Wars.) Em seu computador, é claro, será exibido o seu 
nome de usuário e o nome do seu computador.
3
Depois disso há um sinal de
dois-pontos, seguido da
informação da pasta atual.
Nesse caso, "~", que é um
atalho para a pasta do
usuário.
Em seguida há o caractere
de dólar (ou cifrão),
terminando esse texto
especial. Logo depois o cursor está piscando, esperando 
que você digite um comando.
O nome desse texto especial é "prompt". Ele indica que o 
computador está pronto para receber comandos. É só 
você mandar que ele vai fazer.
Digite, por exemplo, o seguinte comando, que manda o 
terminal navegar para sua área de trabalho:
cd "Área de Trabalho"
Em seguida pressione
ENTER. Com isso,
trocamos de pasta e
estamos agora na área de
trabalho. O prompt deve
4
Pasta do Usuário: cada usuário
do Ubuntu tem sua própria 
pasta para armazenar seus 
arquivos. É aquela pasta que 
no gerenciador de arquivos é 
chamada de "Pasta pessoal". 
Ela geralmente fica dentro da 
pasta "/home". Minha pasta de 
usuário está em "/home/elcio" e
"~" é um atalho muito 
conveniente para ela.
Há um jeito simples de digitar 
comandos e caminhos no 
terminal, que é começar a 
digitar o que você quer e 
pressionar TAB para que seu 
computador os complete.
mudar, desse jeito:
Comando e resposta 
Com isso, você já deve ter percebido o funcionamento 
básico do terminal. Quando o terminal exibe o prompt, 
você deve digitar um comando. Após digitar o comando, 
pressione ENTER e o computador vai executar seu 
comando. 
Durante a execução do comando, até que o prompt 
apareça novamente, você não deve digitar novos 
comandos. Durante a execução o computador pode 
mostrar texto na tela sobre o que o comando está 
5
fazendo. 
Chamamos isso de saída
do comando. Saída é o
texto que um comando
mostra na tela. Ao final
da execução do comando,
o computador mostrará
novamente o prompt,
avisando que está pronto
para receber o próximo comando. Veja esse exemplo de 
terminal com a execução dos comandos date, cd e pwd:
6
A maioria dos comandos é 
executada de modo 
praticamente instantâneo. 
Assim, muitas vezes, ao 
pressionar ENTER você verá 
imediatamente a saída do 
comando e o prompt para 
digitação de um novo comando.
Argumentos de linha de comando 
Para a maioria das tarefas que você pode querer que um 
comando execute será necessário dizer ao computador 
mais do que o nome do comando. Pode ser necessário 
dizer onde e como aquele comando deve ser executado.
Por exemplo, o comando cd espera que você diga para 
que pasta deseja navegar. Assim, para entrar na pasta 
"pasta1", usamos:
cd pasta1
Chamamos essas informações que vão após o comando de
argumentos. Há comandos que podem receber um tipo 
especial de argumento. Por exemplo, o comando ls 
mostra os arquivos de uma pasta e pode receber um 
argumento especial para que mostre também os arquivos 
ocultos, assim:
ls -a
Nós chamamos esses argumentos, que começam com 
hífen, de opções. Assim, a opção -a faz com que o 
comando ls mostre também os arquivos ocultos.
7
Navegando entre pastas e 
operações básicas com 
arquivos
Se você quer de fato usar o terminal, a primeira coisa que 
precisa dominar são as operações básicas com arquivos. 
Elas podem ser feitas com os comandos a seguir.
cd 
Nós já vimos um pouquinho do que o comando cd faz. Ele
navega entre as pastas. Executar o comando cd sem 
argumentos navega para a pasta do usuário. O comando 
cd pode receber como argumento a pasta para a qual 
navegar. Assim:
cd pasta2
Para sair de uma pasta, navegando para a pasta pai, 
usamos dois pontos seguidos, assim:
cd ..
Para entrar em uma pasta dentro de outra, separamos as 
pastas por barra, assim:
cd pastapai/pastafilha
E podemos fazer isso para tantos níveis quantos houver 
8
no caminho da pasta desejada:
cd pastapai/pastafilha/neta/bisneta
Para navegar para uma pasta dentro de sua pasta de 
usuário, não importa em que pasta você esteja, você pode 
começar o caminho com til (~), assim:
cd ~/Documentos/Planilhas
Assim como em qualquer outro comando, sempre que 
você precisar indicar um caminho que contém espaços, 
pode usar aspas para envolver o argumento, assim:
cd "~/Área de Trabalho/Minhas Músicas"
ls
O comando ls lista os arquivos da pasta atual. Você pode 
indicar ao comando que pasta deseja listar, assim:
ls pasta
Você também pode usar a opção -a para exibir todos os 
arquivos, como já mostramos:
ls -a
A opção -l exibe uma listagem detalhada, veja a diferença 
de executar ls com e sem a opção -l na tela a seguir:
9
Nessa tela temos as permissões de cada arquivo, uma 
coluna mostrando quem é o dono do arquivo, outra 
mostrando a que grupo esse arquivo pertence. Temos 
então o tamanho de cada arquivo, seguido da data do 
arquivo.
A opção -h deve ser usada junto com -l, ela faz com que o 
ls exiba o tamanho de cada arquivo em um formato 
amigável para seres humanos. Veja:
10
As opções do comando ls podem ser combinadas. Assim, 
o comando a seguir:
ls -l -h -a
Pode ser escrito assim:
ls -lha
Isso pode ser feito no comando ls e em quase todos os 
comandos que recebem opções de uma única letra. O 
comando ls, assim como a maior parte dos comandos que
mostraremos aqui, tem muito mais opções além das que 
vamos mostrar. Mostraremos só as mais úteis, de uso 
11
mais comum. Se você quiser ler toda a documentação do 
comando ls você pode usar o comando man, assim:
man ls
Mas prepare-se. As documentações são bastante extensas
e a maioria está em inglês.
pwd 
Às vezes estamos dentro de uma pasta no terminal e não 
sabemos exatamente em que pasta estamos. Para isso 
existe o comando pwd, que mostra o caminho completo 
da pasta atual. Veja um exemplo do seu funcionamento:
12
cp 
O comando cp copia arquivos. Você pode copiar um 
arquivo para a mesma pasta, com um novo nome, assim:
cp arquivo.txt novonome.txt
Você também pode copiar um arquivo para dentro de 
uma pasta, desse jeito:
cp arquivo.txt pasta1
Você também pode copiar uma pasta inteira, usando a 
opção -r, assim:
cp -r ~/Documentos/planilhas "~/Área de Trabalho"
mv 
O comando mv move arquivos. Sua sintaxe é bem 
semelhante à do comando cp. Você pode mover um 
arquivo para uma pasta, assim:
mv arquivo.txt pasta1
Ou movê-lo de uma pasta para outra, desse jeito:
mv pasta1/arquivo.txt pasta2
O comando mv também pode ser usado para renomear 
arquivos, desse jeito:
13
mv nomeantigo.txt nomenovo.txt
mkdir 
O comando mkdir cria pastas. Sua sintaxe é bem simples:
mkdir pasta3
Você pode criar de uma única vez uma estrutura de 
pastas dentro de pastas, usando a opção -p, assim:
mkdir -p pastapai/pastafilha/pastaneta
rm 
O comando rm apaga
arquivos. Sua sintaxe
também é bastante
simples, assim:
rm arquivo.txt
Você pode apagar pastas
inteiras, usando a opção 
-r, desse jeito:
rm -r pasta3
14
Cuidado: o terminal confia em
você. Quando você manda ele 
mover, copiar ou apagar, ele 
executa a operação sem 
perguntar nada. Além disso, o 
comando rm apaga 
definitivamente os arquivos, 
não há Lixeira aqui. Por isso, 
todo cuidado é pouco ao usar o 
comando rm.
Entradas e saídas de texto 
O terminal é uma interface baseada em texto. Vamos 
tentar mostrar agora porque isso é bom.
a entrada padrão 
Há uma porção de comandos que esperam que o usuário 
digite alguma coisa. Por exemplo, abra o terminal e digite
o comando python, sem argumentos. Você deve obter 
uma telaassim:
O comando python está sendo executado, e mostrou seu 
próprio prompt:
15
>>>
Isso significa que o comando python está esperando que 
você digite alguma coisa. Em termos técnicos, nós 
dizemos que o comando python está "lendo" (ou 
"ouvindo") o seu teclado. Outra maneira de colocar isso é 
dizer que a entrada padrão para o comando python, nesse
caso, é o teclado. Vamos digitar alguma coisa para ver 
como o comando python se comporta. Digite:
print 2+2
Seguido de ENTER, e você deve ver o comando python 
imprimir para você o resultado da operação, assim:
16
Para encerrar a entrada
padrão, finalizando o
comando python, você
precisa inserir um
caractere de final de
arquivo. Você faz isso
pressionando CTRL+D em
seu teclado. A mesma
coisa vale para
praticamente qualquer comando que leia a entrada 
padrão.
Modificando a entrada padrão 
Vamos agora fazer o comando python ler a entrada 
padrão de outro lugar. Abra o gedit (ou seu editor de 
texto favorito) e crie um arquivo de texto simples cujo 
conteúdo é exatamente o que digitamos para o comando 
python, assim:
17
Python é uma linguagem de 
programação. O comando 
python abre o interpretador 
interativo da linguagem 
Python. Não se preocupe, você 
não precisa aprender Python 
para dominar o terminal, 
embora, se o fizer, não vai se 
arrepender.
Salve com o nome de "soma.txt". Em seguida abra um 
terminal, navegue até a pasta onde você salvou o arquivo 
e execute o seguinte comando:
python < soma.txt
Se você fizer certinho todos os passos, vai ver que o 
comando python imprime o resultado da soma, assim:
O que estamos fazendo aqui é indicando ao comando 
python, através do caractere "<", que ele deve ler a 
entrada padrão do arquivo soma.txt ao invés de ler do 
teclado. Essa técnica é muito, muito útil, como veremos a 
seguir.
18
A saída padrão 
Muitos comandos devolvem informação ao usuário. Um 
exemplo é o comando ls que, como já vimos, exibe na tela 
a listagem da pasta atual. Você se lembra:
A saída do comando ls, assim como a maioria dos 
comandos do terminal, é um texto. 
Esse texto é exibido no terminal, que chamamos aqui de 
"saída padrão". 
Modificando a saída padrão 
Da mesma forma que fizemos com a entrada padrão, é 
19
possível redirecionar a saída padrão de um comando, 
usando o caractere ">", assim:
ls -l > listagem.txt
Assim, indicamos ao comando ls que, ao invés de mostrar
no terminal, ele deve enviar a listagem de pasta para o 
arquivo listagem.txt. Se você seguir corretamente os 
passos acima, vai criar na pasta listada um arquivo assim:
20
Pipes 
Além de fazer com que comandos leiam a entrada padrão 
a partir de arquivos e fazer com que salvem a saída 
padrão em arquivos, é possível conectar comandos. Isso 
significa que um comando lerá a entrada padrão a partir 
da saída padrão de outro comando. Isso é feito através do 
caractere "|", chamado pipe.
Vamos construir um exemplo bem simples disso. Não se 
preocupe se o exemplo parecer muito simples, ou pouco 
útil, é preciso que você entenda bem os conceitos básicos 
para acompanhar o que vem a seguir. Para isso, vamos 
entender primeiro o comando echo. O comando echo 
imprime na tela os argumentos que receber, assim:
21
Assim, você pode fazer com que a saída do comando echo 
seja algo que possa ser lido pelo comando python:
echo print 1+1
E pode concatenar os dois comandos, dessa maneira:
echo print 1+1 | python
Isso vai fazer com que a saída padrão do comando echo 
seja a entrada padrão do comando python. Veja:
Talvez você não enxergue agora o quanto isso pode ser 
útil. Continue lendo, vamos ver isso logo.
22
A saída de erro 
Os comandos em Linux tem uma entrada, a entrada 
padrão, mas duas saídas. A saída padrão, que já vimos, 
onde o comando exibe as coisas que você espera que ele 
exiba, e a saída de erro, onde ele exibe erros e avisa de 
situações inesperadas. Vamos ver um exemplo com o 
comando ls. O comando a seguir salva a listagem da pasta
"pasta existente" no arquivo listagem.txt, veja:
ls "pasta existente" > listagem.txt
Mas o que acontece se você errar ao digitar o nome da 
pasta, mandando o ls exibir a listagem de uma pasta que 
na verdade não existe? Assim, por exemplo:
23
Essa mensagem de erro não foi exibida na saída padrão, 
mas numa outra saída, a saída de erro. 
Você pode perceber isso com facilidade redirecionando a 
saída padrão do comando, assim:
O resultado: como o comando ls não conseguiu listar a 
pasta, o arquivo listagem.txt está vazio. 
E como a mensagem de erro não foi enviada para a saída 
padrão, mas para a saída de erro, ela foi exibida na tela e 
não enviada para o arquivo. 
24
Isso é muito útil. Se a mensagem de erro fosse enviada 
para a saída padrão, você executaria o comando acima e 
acharia que está tudo bem. Só descobriria que houve um 
erro quando precisasse usar o arquivo listagem.txt e 
descobrisse que, ao invés do conteúdo que você esperava, 
ele contém um erro.
Modificando a saída de erro 
Pode haver situações em que, por qualquer motivo, você 
não quer que um comando exiba erros na tela, mas 
prefere salvar esses erros num arquivo para conferir 
depois. 
Você pode fazer isso através dos caracteres "2>". Por 
exemplo:
ls "talvez exista" > listagem.txt 2> erro.txt
Se existir uma pasta chamada "talvez exista", a listagem 
dessa pasta será salva no arquivo listagem.txt. Se a pasta 
não existir, ou houver algum outro erro em obter a 
listagem de arquivos dentro dela, os erros serão salvos no 
arquivo erro.txt.
Concatenando
Os caracteres ">" e "2>" redirecionam a saída padrão e de
erro para arquivos, reescrevendo totalmente os arquivos. 
25
Você pode querer manter o conteúdo do arquivo, 
escrevendo ao final dele.
Isso é realmente muito útil. Você pode querer manter um 
histórico de todas as vezes que um comando foi 
executado, por exemplo.
Para fazer isso, você usa os caracteres ">>" e "2>>". 
Observe o comando a seguir:
ls "talvez exista" >> listagem.txt 2>> erro.txt
Ele faz a mesma coisa que o anterior, com uma diferença:
ele não reescreve os arquivos listagem.txt e erro.txt, ele 
escreve as saídas ao final deles.
26
Comandos para lidar com texto
A interface do terminal é baseada em texto. E isso é 
incrível. Texto é um formato de dados padronizado, 
simples de ler e trabalhar, e universal. 
Por isso, se você deseja dominar o terminal, a primeira 
coisa que você precisa aprender bem é trabalhar com 
texto. Vamos ver agora alguns comandos simples para 
trabalhar com texto. São fáceis de aprender e simples de 
usar, mas quando usados juntos permitem fazer coisas 
muito poderosas.
cat 
O comando cat lê a entrada padrão e despesa o conteúdo 
na saída padrão. Experimente executar o comando cat 
sem argumentos, assim:
cat
O comando cat vai ficar esperando que você digite texto. 
Ele vai então repetir na saída padrão cada linha que você 
digitar. Experimente. Para terminar a entrada padrão, 
encerrando o comando cat, pressione CTRL+D.
Bom, isso não é muito útil, certo?
Mas como você já sabe redirecionar a entrada e saída 
27
padrão, o comando cat pode ser bastante útil. Por 
exemplo, você pode redirecionar a saída do comando cat 
para um arquivo, assim:
cat > texto.txt
E em seguida o comando cat vai esperar que você digite 
texto mas, ao invés de repetir na tela o texto que você 
digitar, ele vai salvá-lo no arquivo texto.txt.
Para ver o conteúdo de um arquivo, você pode 
redirecionar a entrada padrão do comando cat. Por 
exemplo:
cat < texto.txt
Isso vai mostrar na tela o conteúdo do arquivo texto.txt. 
Essa é uma situação tão comum que o comando cat tem 
uma maneira própria para fazer isso. Se você passar um 
arquivo como argumento ao comando cat ele vai ler a 
entrada desse arquivo. Assim, o caractere "<" é 
dispensável:
cat texto.txt
Isso vai funcionar para o comando cat e para a maioria 
dos comandos para lidar com texto.28
grep 
O comando grep funciona de maneira semelhante ao 
comando cat, mas ele espera um argumento. Esse 
argumento é um padrão de busca. Em seguida o grep 
começa a ler a entrada padrão, mas só vai repetir na saída
padrão as linhas que contiverem o padrão de busca. Veja 
o exemplo:
Você pode usar o comando grep para encontrar texto 
dentro de um arquivo. Da mesma forma que com o 
comando cat, você pode redirecionar a entrada padrão ou
pode simplesmente passar um arquivo como argumento 
para o comando grep, assim:
29
Se você passar a opção -n o comando grep vai exibir 
também o número da linha encontrada. Veja:
30
Se você quiser salvar os resultados do comando grep, 
como você já deve ter deduzido, pode redirecionar a saída
do comando grep para um arquivo. Assim:
grep Antônio listagem.txt > encontrados.txt
Isso vai procurar no arquivo listagem.txt todas as linhas 
que contenham o texto "Antônio", salvando os resultados 
num novo arquivo, encontrados.txt
Uma última dica útil do comando grep é que você pode 
usá-lo para inverter a busca, através da opção -v. Assim, 
ele vai exibir apenas as linhas que não contém o termo 
buscado. Veja como exibir o arquivo soneto.txt, excluindo
todas as linhas que tem o texto "ente":
31
less 
Muitas vezes você quer ver o conteúdo de um arquivo, 
mas ele é muito extenso para a sua janela do terminal. 
Uma maneira prática de exibi-lo é através do comando 
less. Execute:
less arquivo.txt
E o comando less vai exibir o início do arquivo e deixar 
você navegar usando as setas do teclado ou as teclas Page 
Up e Page Down. Outra jeito de usar o comando less é 
redirecionando a saída longa de outro comando para ele. 
Por exemplo, para examinar uma listagem de pasta com 
muitos arquivos você pode fazer:
ls -lh | less
tee 
Em outras situações você pode querer salvar a saída de 
um comando em um arquivo e, ao mesmo tempo, 
examiná-la na tela ou redirecioná-la para outro comando.
Por exemplo, digamos que você queira salvar uma longa 
listagem de pasta num arquivo e, em seguida, examinar 
essa listagem. Você poderia executar dois comandos em 
sequência, assim:
ls -lh > listagem.txt
less listagem.txt
32
É possível fazer isso de uma vez só, usando o comando 
tee. O comando tee lê a entrada padrão e faz duas coisas 
com ela. Ao mesmo tempo em que ele a salva num 
arquivo, também a exibe na saída padrão. Assim, se você 
fizer:
ls -lh | tee listagem.txt
A saída do comando ls será salva no arquivo listagem.txt 
e também exibida na tela. Você também pode 
redirecionar a saída padrão do comando tee, 
concatenando através de pipe em outro comando, assim:
ls -lh | tee listagem.txt | less
O comando ls vai listar a pasta e enviar a saída para o 
comando tee, que vai salvar a saída no arquivo 
listagem.txt e, ao mesmo tempo, enviá-la para o comando
less, que vai exibi-la na tela e permitir você navegar pela 
listagem.
Tudo isso num comando só.
33
wc 
O comando wc é um contador de palavras. Veja:
O arquivo soneto.txt tem 20 linhas, 98 palavras e 546 
caracteres. Você também pode redirecionar a saída de 
outro comando para o comando wc. Se você quer contar 
apenas linhas, você pode usar a opção -l do comando wc. 
Por exemplo, para contar quantos arquivos há numa 
pasta, você pode fazer:
ls | wc -l
34
sort 
O comando sort lê a entrada padrão e exibe as linhas em 
ordem na saída padrão. Digamos que você tenha um 
arquivo com a lista de presença de alunos de uma 
determinada turma. Você pode exibir a lista em ordem 
alfabética, assim:
sort chamada.txt
O comando sort pode receber a opção -u, que faz com que
a lista de resultados seja única, isso é, a opção -u remove 
as linhas duplicadas. Além disso, o comando sort pode 
receber a opção -n, que faz ordenação numérica e não 
alfabética. Se você precisa ordenar números, a opção -n é 
o que você precisa.
Digamos que você tenha um diretório de arquivos de 
chamada e você precisa de uma lista de alunos que 
vieram em qualquer uma das aulas. Você pode fazer:
cat *.txt | sort -u
O comando cat vai enviar para o comando sort o 
conteúdo de todos os arquivos txt da pasta. O comando 
sort vai então ordenar os resultados, removendo os 
duplicados.
35
Caracteres coringa
Você deve ter notado, no exemplo acima, o uso do 
caractere "*". Ele é um caractere coringa. Há alguns 
caracteres coringa que você pode usar ao escrever nomes 
de arquivos ou pastas. Os dois mais úteis são "*" e "?".
O caractere coringa "*" significa "qualquer coisa". Veja 
esse comando:
rm *
Isso vai excluir todos os arquivos da pasta atual. Veja esse
outro:
rm a*.txt
Isso vai excluir todos os arquivos cujo nome começa com 
"a" e termina com ".txt". 
O caractere coringa "?" significa "qualquer caractere". 
Veja esse outro comando:
rm lista?.txt
Isso vai apagar os arquivos lista1.txt, lista5.txt, listab.txt, 
mas não o arquivo lista10.txt ou listachamada.txt.
36
Donos e Permissões 
Uma das coisas mais legais no Linux é a maneira como 
ele controla as permissões de arquivos. Cada arquivo ou 
pasta no Linux tem um dono, um grupo e um conjunto de
permissões. Você pode conferir isso com a saída do 
comando ls, veja:
A primeira coisa em vamos nos concentrar é em como ler 
aquela coluna de permissões. Ela tem dez caracteres. O 
primeiro caractere é o tipo de arquivo. 
Um sinal de menos ("-") significa que essa linha da lista é 
apenas um arquivo comum. Um caractere "d" significa 
37
permissões usuário grupo
que essa linha se trata de uma pasta. Para um caractere 
"l" temos um link (uma espécie de atalho). Um caractere 
"p" mostra um arquivo especial, do tipo pipe. Um 
caractere "c" mostra um dispositivo como, por exemplo, 
seu cdrom.
Os outros nove caracteres estão divididos em blocos de 
três.
O primeiro bloco são as permissões para o usuário dono 
do arquivo, o segundo bloco as permissões para o grupo e
o último bloco são as permissões para todos os usuários.
Cada bloco pode ter as permissões:
r - leitura
w - escrita
x - execução
Veja:
 tipo user grupo outros
 - rwx r-x r--
Assim, uma linha de permissões "-rwxrw-r--" significa 
que temos um arquivo comum ("-"), cujo dono pode ler, 
escrever e executar ("rwx"), o grupo pode ler e executar 
("r-x") e os outros usuários podem apenas ler ("r--").
38
chown e chgroup 
Você pode mudar o usuário dono ou o grupo a que um 
arquivo pertence usando os comandos chown e chgroup. 
Para mudar o usuário, faça:
chown joaquim texto.txt
Isso vai fazer com que o arquivo texto.txt pertença ao 
usuário joaquim. Para mudar o grupo, faça:
chgroup financeiro texto.txt
Isso vai fazer com que o arquivo texto.txt pertença ao 
grupo financeiro. Você também pode mudar, num único 
comando, o usuário e grupo de um arquivo, usando o 
comando chown, assim:
chown joaquim:financeiro texto.txt
chmod 
Para mudar as permissões de um arquivo, você pode usar 
o comando chmod. Para dar permissão de execução a um 
arquivo, use:
chmod +x texto.txt
Para dar permissão de leitura e escrita, e remover a 
permissão de execução, use:
39
chmod +rw-x texto.txt
Você pode definir um alvo para o comando chmod. Por 
exemplo, para dar permissão de execução apenas para o 
usuário dono, faça:
chmod u+x texto.txt
Ou para o grupo:
chmod g+x texto.txt
Ou para o grupo e o usuário dono, de uma vez só:
chmod ug+x texto.txt
Os alvos possíveis são:
u - usuário dono
g - grupo
o - os outros usuários
a - todos os alvos (equivalente a "ugo")
40
Trabalhando com listas 
Uma das coisas mais legais para se fazer em seguida é 
aprender a trabalhar com listas de arquivos. Isso torna o 
terminal uma ferramenta poderosíssima de automação.
find 
O comando find serve para encontrar arquivos dentro de 
uma estrutura de pastas. Veja um exemplo da saída do 
comando find:
O comando find pode receber uma série de argumentos. 
O primeiro deles é uma pasta. Assim, comando a seguir 
listatodos os arquivos e pastas dentro da pasta "Pasta 1":
41
find "Pasta 1"
O argumento -type, seguido de uma letra, filtra a lista por
tipo. O comando a seguir lista apenas arquivos:
find -type f
E esse lista apenas pastas:
find -type d
Há uma peculiaridade no comando find. Se você quer 
procurar dentro de uma pasta, a pasta alvo deve sempre 
ser o primeiro argumento. Assim, o comando a seguir não
funciona:
find -type f "Pasta 1"
O correto é:
find "Pasta 1" -type f
O argumento -atime filtra os arquivos pela última vez que
foram acessados. O comando a seguir lista os arquivos 
que foram acessados pela última vez há três dias:
find -atime 3
Você pode usar os sinais de + e - para modificar o 
comportamento do -atime. O comando a seguir mostra os
arquivos acessados a mais de dez dias:
42
find -atime +10
E os acessados a menos de cinco dias:
find -atime -5
O argumento -name procura por arquivos cujo nome casa
com determinado padrão. Por exemplo, para encontrar 
todos os arquivos cujo nome termina com .bak, você pode
fazer:
find -name "*.bak"
find -exec 
Uma das coisas mais legais que você pode fazer com o 
comando find é mandá-lo executar um comando para 
cada arquivo encontrado. Fazemos isso através do 
argumento -exec. O argumento -exec deve ser seguido do 
comando a ser executado. No lugar onde você deseja 
incluir o nome do arquivo, coloque os caracteres {}, e 
termine o comando a ser executado com os caracteres ";".
Assim:
find -name "*.bak" -exec rm {} ";"
O comando acima executa o comando rm para cada 
arquivo encontrado. Assim, digamos que o find encontre 
cinco arquivos com extensão bak na pasta, assim:
43
o.bak
x.bak
pasta/y.bak
pasta/k.bak
pasta2/pasta3/w.bak
O comando find vai executar o comando rm para cada um
dos arquivos acima, assim:
rm o.bak
rm x.bak
rm pasta/y.bak
rm pasta/k.bak
rm pasta2/pasta3/w.bak
xargs
Um outro jeito de fazer com que o comando find execute 
um comando para cada um dos resultados encontrados é 
através do comando xargs. O comando xargs lê a entrada
padrão e transforma em argumentos para um outro 
comando. Você pode usá-lo com o find, por exemplo, 
assim:
find -name "*.bak" | xargs rm
A principal diferença entre usar o comando xargs ou o 
argumento -exec do comando find é que o comando 
xargs vai executar o comando alvo uma única vez.
44
Assim, ao invés de executar:
rm o.bak
rm x.bak
rm pasta/y.bak
rm pasta/k.bak
rm pasta2/pasta3/w.bak
O comando xargs vai executar:
rm o.bak x.bak pasta/y.bak pasta/k.bak pasta2/p...
Se a lista de arquivos encontrados é muito grande, isso 
tem um grande impacto na performance de execução.
for 
Vamos agora aprender a trabalhar com o for, que não é 
um comando, mas uma estrutura de controle. As 
estruturas de controle são um recurso poderosíssimo do 
terminal, e um assunto um pouco mais avançado. Mas 
aprender o básico sobre a estrutura for vai permitir, 
imediatamente, que você faça algumas coisas que 
realmente valem a pena.
A estrutura for serve para executar um ou mais 
comandos. Esses comandos formam um bloco de 
comandos.
Digamos que você queira, por exemplo, para cada arquivo
com a extensão txt numa pasta exibir os detalhes do 
45
arquivo, seguido da contagem de linhas e palavras desse 
mesmo arquivo, você pode fazer:
for arquivo in *.txt; do
 ls -lh $arquivo
 wc $arquivo
done
Esse trecho, que fica entre as palavras chave do e done, é 
o bloco de comandos:
for arquivo in *.txt; do
 ls -lh $arquivo
 wc $arquivo
done
A estrutura for vai, para cada um dos arquivos em *.txt, 
executar o bloco de comandos. No bloco de comandos o 
texto $arquivo será substituído pelo nome do arquivo. O 
nome disso é variável. Assim, essa estrutura for trabalha 
com a variável $arquivo.
46
Automatizando 
A grande vantagem de se usar o terminal em relação à 
interface gráfica é o fato de você poder automatizar 
tarefas. É disso que vamos falar agora.
Criando scripts 
Digamos que você, todos os dias, entre numa pasta, 
apague todos os arquivos de backup (com a extensão 
.bak.) Em seguida você salva a data e hora atual no 
arquivo resultados.txt. Em seguida, conta quantas linhas 
tem o arquivo matriculas.txt e salve o resultado no 
arquivo resultados.txt. Com isso, o arquivo resultados.txt 
tem um relatório dos resultados dia a dia.
Os comandos que você executa todo dia são:
cd ~/curso
find -name "*.bak" | xargs rm
data >> resultados.txt
wc -l matriculas.txt >> resultados.txt
Você pode salvar esses comandos num arquivo. O nome 
que a gente dá a um arquivo com uma sequência de 
comandos é script.
Para criar nosso primeiro script, vamos criar um arquivo 
de texto com os comandos acima, desse jeito:
47
Salve o arquivo como "rotina_diaria". Em seguida, entre 
na pasta onde você salvou o arquivo e dê permissão de 
execução nele, assim:
chmod +x rotina_diaria
Pronto. Agora nosso arquivo é um script, e pode ser 
executado. Todos os dias, para executar a rotina diária, 
entre na pasta onde o script está salvo execute:
./rotina_diaria
E pronto, sua sequência de comandos será executada.
48
Argumentos para scripts 
Agora, digamos que você precise executar essa sequência 
de comandos acima em pastas diferentes. Em algumas 
você precisa executar essa sequência todo dia, em outras, 
só de vez em quando.
Como você vai fazer? Criar um script para cada pasta?
Nós podemos fazer com que nosso script receba 
argumentos. É fácil. Vamos alterar nosso código para 
ficar assim:
cd $1
find -name "*.bak" | xargs rm
data >> resultados.txt
wc -l matriculas.txt >> resultados.txt
Note que trocamos o nome da pasta por $1. Os 
argumentos que você passar para seu script ao executá-lo 
estarão disponíveis dentro do script nas variáveis 
especiais $1, $2, $3, $4 e assim por diante. Alterando 
nosso código como acima, para executar a rotina diária 
para a pasta ~/curso, digite:
./rotina_diaria ~/curso
Para executar para a pasta ~/curso2/matriculas/ digite:
./rotina_diaria ~/curso2/matriculas/
49
Bônus: Exemplos 
Seguem alguns exemplos de comandos úteis que você 
pode usar para automatizar tarefas, além de pacotes que 
você pode instalar em seu Ubuntu para ter novos 
comandos disponíveis.
Pacote Ubuntu: random faux Latin text 
generator 
O pacote libtext-lorem-perl contém um gerador de Lorem
Ipsum para o seu terminal. Eu tinha até feito um script 
para isso antes de saber da existência desse pacote. Para 
instalar: 
sudo apt-get install libtext-lorem-perl 
E para usar: 
lorem 
Para gerar vários parágrafos, use a opção -p informando 
quantos parágrafos você quer: 
lorem -p12 
Pacote Ubuntu: cclive 
O pacote cclive, para download de vídeos do YouTube na 
linha de comando, é uma reescrita do clive mais eficiente,
com menor consumo de memória e menos dependências. 
50
Para instalar: 
sudo apt-get install cclive 
E para usar: 
cclive http://www.youtube.com/watch?v=8fvTxv46ano 
Isso vai baixar o vídeo na pasta atual. Simples e indolor. 
Mas qual a vantagem de usar a linha de comando em 
relação a uma extensão no navegador, onde você não 
precisa digitar comandos? Com a linha de comando é 
possível automatizar as tarefas. Criei um script que 
recebe um nome de usuário do YouTube e baixa os 
últimos 15 vídeos publicados. Chamei o arquivo de 
massclive. Veja o código fonte: 
mkdir -p $1 
lynx --dump http://www.youtube.com/user/$1/feed | \
 grep youtube.com/watch | \ 
 sed -e "s/.* //" | \ 
 sed -e "s/&.*//" | \ 
 sort -u | \ 
 while read url 
 do 
 cclive -c --output-dir $1 $url 
 done 
E você pode usar assim: 
./massclive maninthearenatv 
51
Cowsay: a vaquinha falante do Linux 
Teste aí: 
sudo apt-get install cowsay 
Depois rode: 
cowsay Funciona... 
O cowsay também pode receber texto na entrada padrão: 
date|cowsay 
Isso permite usos razoavelmente criativos: 
lynx --dump http://news.google.com.br \
 | grep "^\[" | grep -v "»" \ 
 | sed -e "s/.*\]//g" | sort -R | head-n 1|cowsay
Você pode colocar seu Ubuntu para te dar uma dica de 
Linux toda vez que você abre o terminal, assim: 
sudo apt-get install fortunes-ubuntu-server 
Depois edite o arquivo ~/.bashrc e inclua no final: 
fortune|cowsay 
E pronto! Cada vez que você abrir um terminal vai 
receber uma dica de Ubuntu. 
52
Fazendo o comando rm enviar arquivos para 
a Lixeira 
Talvez você tenha um pouco de medo de usar o comando 
rm, porque ele exclui definitivamente os arquivos. Não há
“lixeira”, e todos os métodos disponíveis para desfazer a 
deleção, como o ext2undel, não passam de boas tentativas
com uma razoável chance de insucesso. 
Você sabia que pode enviar um arquivo para a lixeira a 
partir do terminal, ao invés de apagá-lo? Para isso, você 
precisa instalar o pacote trash-cli. No Ubuntu, faça: 
sudo apt-get install trash-cli 
Em seguida você pode usar, no lugar do comando rm, o 
comando trash: 
trash arquivo_a_apagar.txt 
Você também pode manipular a lixeira com os comandos 
trash-list, restore-trash e trash-empty. 
Substituindo o comando rm 
E se quiser você evitar usar o comando rm por engano, 
insira no final de seu .bashrc: 
53
alias rm=trash 
Assim, cada vez que você digitar o comando rm, será na 
verdade executado o comando trash. E se você 
deliberadamente quiser excluir um arquivo, sempre 
poderá chamar o comando rm digitando uma 
contrabarra, assim: 
\rm arquivo_a_apagar.txt 
Mas você tem certeza que vai substituir o 
comando rm? 
Na página do trash-cli o autor trata dessa questão. Ele diz
que, embora você possa substituir o comando rm pelo 
trash, você não deveria, porque os argumentos dos dois 
comandos são diferentes. Por exemplo, o comando rm 
exige o argumento -R para remover diretórios, o trash 
não. Então ele sugere que não o faça. 
Mas, se você tem medo de apagar arquivos por engano, 
ele sugere uma outra abordagem. Crie um alias para o 
comando rm em seu .bashrc assim: 
alias rm='echo "Você não quer fazer isso."; false' 
E pronto, você não vai mais executar o comando rm por 
engano, mas, do mesmo modo que no primeiro exemplo, 
sempre poderá executá-lo deliberadamente, começando 
54
com uma contrabarra. 
 
Extraindo o áudio MP3 de um vídeo
Para extrair apenas o áudio, em MP3, de um vídeo, faça: 
ffmpeg -i entrada_video.mp4 -vn saida_audio.mp3 
Simples e rápido. E fácil de automatizar. 
Configurando o locale no Ubuntu 
É um problema comum ao configurar um novo servidor 
com Ubuntu, descobrir que não há um locale válido 
configurado, ou descobrir que o locale padrão não é o que
você desejava. Os sintomas comuns de um sistema sem 
um locale válido são as seguintes mensagens: 
locale: Cannot set LC_CTYPE to default locale: No 
such file or directory 
locale: Cannot set LC_ALL to default locale: No 
such file or directory 
Ou essa outra, bem mais assustadora: 
perl: warning: Setting locale failed. 
perl: warning: Please check that your locale 
settings: 
 LANGUAGE = (unset), 
 LC_ALL = (unset), 
 LC_CTYPE = "pt_BR.UTF-8", 
 LANG = "en_US.UTF-8" 
 are supported and installed on your system. 
55
perl: warning: Falling back to the standard locale 
("C"). 
Os sintomas de um locale diferente do que você gostaria 
são mensagens em algum idioma estranho. 
Como corrigir? Vou explicar aqui, porque esse arquivo 
fica num local muito inusitado, em minha opinião. Não 
está em /etc. Edite, como root, o arquivo: 
/var/lib/locales/supported.d/local 
E coloque os locales que você quer que o sistema suporte. 
A maioria dos usuários brasileiros vai se dar bem com 
esse conteúdo: 
pt_BR ISO-8859-1 
pt_BR.UTF-8 UTF-8 
No meu caso, como faço questão de trabalhar 
exclusivamente com Unicode, eu deixo esse arquivo 
assim: 
pt_BR.UTF-8 UTF-8 
Em seguida rode: 
sudo dpkg-reconfigure locales 
Isso deve resolver o problema. 
56
O Linux também fala 
Há um tempo eu ensinei aqui como fazer o Mac falar. O 
Linux também faz. Instala aí: 
sudo apt-get install espeak 
Daí é só mandar: 
espeak "Luke, I am your father." 
E fala português também: 
espeak -v pt "Luke, eu sou seu pai." 
Com -f arquivo.txt, ele lê o texto de um arquivo. Com -w 
arquivo.wav, ele salva o áudio num arquivo. E pode ser 
comandado via ssh. 
Consegue imaginar utilidades para isso? 
Streamming e download ao mesmo tempo. 
Há um vídeo enoooorme na internet em que você tem 
muito interesse. Você quer baixar e guardar o vídeo, mas 
ao mesmo tempo quer assistí-lo logo. Se você iniciar o 
download e tentar assistir via streamming ao mesmo 
57
tempo, vai consumir o dobro da banda necessária, o 
streamming vai ficar pausando a cada dois segundos e o 
download vai levar muito tempo. O que fazer? Não sei se 
há no Windows algum player que faça download e toque 
ao mesmo tempo. No linux eu resolvo assim, numa janela
de terminal: 
wget -c http://servidor.com.br/video.wmv 
Em outra: 
tail -c 10000000000 -f video.wmv |mplayer - 
Explicando, o primeiro comando, o wget, faz o download 
do vídeo. O parâmetro -c faz com que, se o arquivo 
existir, o download seja continuado de onde parou. Isso é 
útil porque se o download for interrompido, depois você 
pode continuá-lo com o mesmo comando. 
O segundo é uma concatenação de comandos Unix. A 
parte “tail -c 10000000000 -f tableless.wmv” é um 
comando e “mplayer -” é outro. O primeiro usa o tail, que 
imprime o final de um arquivo. Experimente, por 
exemplo: 
tail /var/log/syslog 
Você vai ver as últimas linhas do log do sistema. O 
parâmetro -c recebe um número, o número de bytes a 
58
imprimir a partir do fim do arquivo. Você pode colocar 
qualquer número que seja maior que o arquivo inteiro. O 
parâmetro -f faz o tail ficar esperando por conteúdo novo 
no fim do arquivo. Experimente rodar num terminal, por 
exemplo: 
tail -f /var/log/syslog 
Você vai ver as últimas linhas do syslog e o tail vai ficar 
esperando por conteúdo novo. Abra programas, execute 
ações no sistema, pare e inicie daemons e você vai ver as 
novas linhas aparecendo ali. A mesma coisa acontece 
como vídeo. O tail vai despejar na tela todo o conteúdo do
arquivo, e vai ficar esperando. A medida que o wget baixa 
mais dados, o tail vai imprimindo o que chega. 
O pipe depois do tail envia os dados do vídeo para o 
comando mplayer, um player de vídeo muito poderoso e 
flexível.
59
Fique por dentro:
http://visie.com.br/treinamento/ 
Aprenda Javascript:
http://js.visie.com.br/ 
60
http://js.visie.com.br/
http://visie.com.br/treinamento/
	O que é o prompt e como funciona
	Comando e resposta
	Argumentos de linha de comando
	Navegando entre pastas e operações básicas com arquivos
	cd
	ls
	pwd
	cp
	mv
	mkdir
	rm
	Entradas e saídas de texto
	a entrada padrão
	Modificando a entrada padrão
	A saída padrão
	Modificando a saída padrão
	Pipes
	A saída de erro
	Modificando a saída de erro
	Concatenando
	Comandos para lidar com texto
	cat
	grep
	less
	tee
	wc
	sort
	Caracteres coringa
	Donos e Permissões
	chown e chgroup
	chmod
	Trabalhando com listas
	find
	find -exec
	xargs
	for
	Automatizando
	Criando scripts
	Argumentos para scripts
	Bônus: Exemplos
	Pacote Ubuntu: random faux Latin text generator
	Pacote Ubuntu: cclive
	Cowsay: a vaquinha falante do Linux
	Fazendo o comando rm enviar arquivos para a Lixeira
	Extraindo o áudio MP3 de um vídeo
	Configurando o locale no Ubuntu
	O Linux também fala
	Streamming e download ao mesmo tempo.
	Fique por dentro:
	http://visie.com.br/treinamento/
	Aprenda Javascript:
	http://js.visie.com.br/

Continue navegando