Skip to main content

103.3 - Realizar o Gerenciamento Básico de Arquivos


Esse tópico aborda os comandos básicos para um bom gerenciamento dos arquivos do linux.



PWD


Informa em qual diretório o shell se encontra.

linux:~/$ pwd
/tmp/


CD


Altera o diretório atual, mudando de diretório (entra nas pastas).

Para entrar numa pasta, basta digita cd DIRETORIO, onde diretório é a pasta que você quer acessar.

Exemplos:

# Entrando na pasta tmp:
linux:~/$ cd /tmp/

# Entrando na pasta documentos:
linux:~/$ cd /home/user/Documentos/

Caminho absoluto: Começa sempre com a barra no início, começa sempre do diretório de topo (a raiz, ou seja, a /).

Caminho relativo: Omiti o diretório de topo, começa sempre de um diretório dentro dele.

# Entrando na HOME usando caminho absoluto
linux:~/$ cd /home/user/

# Entrando na HOME usando caminho relativo
linux:~/$ cd ~

# Entrando na pasta documentos usando o caminho relativo:
linux:~/$ cd ~/Documentos/


FILE


Ele reconhece o tipo de dado contido num objeto. Como no Unix não se usa muito a extensão do arquivo, então, para saber do que se trata esse arquivo, usa-se o comando file, que analisa o objeto e informa que tipo de objeto ele é.

Exemplo:

linux:~/$ file nag2.pdf
nag2.pdf: PDF document, version 1.2

Ah, mas esse arquivo é um pdf porque têm .pdf nele. Então analisemos o exemplo abaixo:

linux:~/$ file nag2
nag2: PDF document, version 1.2

Foi removido a extensão do arquivo e mesmo assim, o comando file analisa o objeto e informa do que se trata.



LS


Lista os arquivos dentro de um diretório.

Opções:

-a        Exibe também os arquivos ocultos;
-d Lista somente o diretório em sí (pasta);
-h Exibe o tamanho do diretório/arquivo de forma legível;
-i Exibe o número inode;
-l Exibe as propriedade;
-r Exibe por ordem alfabética inversa;
-t Ordena por data de modificação, sendo mais recente os primeiros;
-F Exibe o tipo de arquivo;
-R Exibe recursivamente;
--color Exibe tudo de forma colorida.

Propriedades

Ao rodar o comando 'ls -lh', será apresentado uma série de informações sobre cada arquivo, segue abaixo dois exemplos:

-rw-rw-r-- 1 USER USER 49 jul 22 21:05 join.txt
drwxrwxr-x 2 USER USER 4,0K jul 22 21:02 rename/

Arquivo join.txt:

-rw-r--r-- = (Tipo de arquivo / Tipo de permissão;)

1 = Quantidade de Hardlinks (Quantos inodes iguais existem);

USER USER = Dono e Grupo ao qual o arquivo/pasta pertence;

49 = Tamanho do arquivo em bytes.

jul 22 21:05 = Data da última modificação;

join.txt = Nome do arquivo/Diretório.

Diretório rename:

drwxrwxr-x = (Tipo de arquivo / Tipo de permissão;)

2 = Quantidade de Hardlinks (Quantos inodes iguais existem);

USER USER = Dono e Grupo ao qual o arquivo/pasta pertence;

4,0K = Tamanho do arquivo em Kilobyte.

jul 22 21:02 = Data da última modificação;

rename = Nome do arquivo/Diretório.

Perceba que arquivos comum só possuem 1 Hardlink, enquanto qualquer pasta possui 2 Hardlinks.


Porque pastas possuem 2 Hardlinks ao criar a pasta?

Quando criamos um arquivo/pasta no linux, o filesystem da a eles um número de inode, esse número vai representar esse arquivo/pasta nesse filesystem ("não terá outro igual no mesmo filesystem").


Vamos ver isso na seção do comando ln.

Mas quando criamos um hardlink (link físico ou atalho físico), na prática, o sistema de arquivo cria outro arquivo com o mesmo número de inode, esse é um dos motivos que não podemos criar hardlinks de diretórios. Para mais detalhe consulta a seção do comando ln.


Explicando os diretórios ocultos em pastas

Conteúdos ocultos no linux são pastas ou arquivos, que começam com . (ponto) antes do nome do arquivo/pasta. Ao executar o 'ls -a' em um diretório, é exibido 2 diretórios no topo da lista, são eles:

# Listando o conteúdo oculto da pasta /tmp:
linux:/tmp\$ ls -lha
drwxrwxrwt 19 root root 4,0K jul 22 21:03 .
drwxr-xr-x 23 root root 4,0K jul 19 14:39 ..

. - É o diretório atual; .. - É o diretório anterior.


Demonstrando o que foi dito acima:

# Crie uma pasta chamada pasta1 no /tmp
linux:/tmp\$ mkdir pasta1

# Liste o inode da pasta1 e do /tmp
linux:/tmp\$ ls -id pasta1 /tmp/
8657494 pasta1 7864321 /tmp/
# O inode da pasta1 é 8657494, e do /tmp é 7864321.

# Agora liste o inode do diretório oculto chamado '..' (ponto ponto)
# dentro de pasta1:
linux:/tmp\$ ls -id pasta1/..
7864321 pasta1/..
# Perceba que o inode do diretório oculto chamado '..' (ponto ponto)
# é o mesmo do /tmp, isso porque o '..' sempre vai referenciar o
# diretório anterior.

# Exemplo do uso do diretório chamado '..':
linux:/tmp\$ cd ..
# Volta um diretório (mesmo inode do '..' e do diretório anterior)

Agora exemplificando o diretório . (ponto):

# Agora liste o inode do diretório oculto chamado '.' (ponto) 
# dentro de pasta1:
linux:/tmp\$ ls -id pasta1/.
8657494 pasta1/.

# Perceba que ele tem o mesmo inode da pasta1, assim, em comandos como 'cp'
# podemos simplesmente coloca o '.' no final, que representa nosso diretório
# atual.

# Entre na pasta1
linux:/tmp\$ cd pasta1

# agora copie qualquer coisa do /tmp para pasta1:
linux:/tmp/pasta1\$ cp /tmp/arq.gz .

# liste o conteúdo de pasta1:
linux:/tmp/pasta1\$ ls -lha
drwxrwxr-x 2 USER USER 4,0K jul 22 21:36 .
drwxrwxrwt 20 root root 4,0K jul 22 21:25 ..
-rw-rw-r-- 1 USER USER 202 jul 22 21:36 arq.gz

# perceba que a cópia funcionou graças ao inode que foi explicado acima.

Outro Exemplo:

# Verifique o INODE do /etc/ssh (512701):
$ ls -lhdi /etc/ssh/
512701 drwxr-xr-x. 3 root root 245 Mar 31 14:15 /etc/ssh/

# Vamos ver os inodes dentro de /etc/ssh:
$ ls -lhai /etc/ssh/
total 612K
512701 drwxr-xr-x. 3 root root 245 Mar 31 14:15 .
67108993 drwxr-xr-x. 82 root root 8.0K Apr 2 13:41 ..
512702 -rw-r--r--. 1 root root 564K Apr 27 2020 moduli
585624 -rw-r--r--. 1 root root 1.8K Apr 27 2020 ssh_config
585625 drwxr-xr-x. 2 root root 28 Feb 11 09:50 ssh_config.d
585382 -rw-r-----. 1 root ssh_keys 492 Mar 31 14:15 ssh_host_ecdsa_key
439422 -rw-r--r--. 1 root root 162 Mar 31 14:15 ssh_host_ecdsa_key.pub
585031 -rw-r-----. 1 root ssh_keys 387 Mar 31 14:15 ssh_host_ed25519_key
585381 -rw-r--r--. 1 root root 82 Mar 31 14:15 ssh_host_ed25519_key.pub
439423 -rw-r-----. 1 root ssh_keys 2.6K Mar 31 14:15 ssh_host_rsa_key
624452 -rw-r--r--. 1 root root 554 Mar 31 14:15 ssh_host_rsa_key.pub
585638 -rw-------. 1 root root 4.2K Feb 11 10:01 sshd_config
# Perceba que o diretório ponto tem o mesmo inode do /etc/ssh (512701)

# /etc/ssh tem 3 hardlinks, porque?

# Dentro de /etc/ssh temos um diretório (ssh_config.d) e esse diretório possui um subdiretório chamado ponto-ponto '..' que tem o mesmo inode do /etc/ssh, veja abaixo:
$ ls -lhai /etc/ssh/ssh_config.d/
total 4.0K
585625 drwxr-xr-x. 2 root root 28 Feb 11 09:50 .
512701 drwxr-xr-x. 3 root root 245 Mar 31 14:15 ..
585626 -rw-r--r--. 1 root root 831 Apr 27 2020 05-redhat.conf


CP


Faz uma cópia de arquivos ou diretórios.

Opções:

-i  pergunta antes de sobrescrever;
-v Exibe tudo que está sendo copiado;
-r Recursivo, faz cópia de diretório;
-p Preserva as características, como dono, grupo e última atualização.

Exemplos

# Copia o arquivo1 para outra pasta e renomeia ele no processo;
linux:~/$ cp arquivo1 aula/teste1

# Copia o arquivo1 para outra pasta e mantém seu nome;
linux:~/$ cp arquivo1 aula/

# Copia a pasta aula e cola no /tmp.
linux:~/$ cp -r aula/ /tmp/

# Copia a pasta aula preservando suas características e cola no /tmp.
linux:~/$ cp -rp aula/ /tmp/


MV


Faz a movimentação de objetos ou renomeia objetos.

Para mudar o nome do objeto não deve ser especificado nenhum diretório, caso seja especificado ele irá mover ao invés de renomear.

# Renomeia um arquivo, o objeto nag2 será renomeado para linux_admin.pdf
linux:~/$ mv nag2 linux_admin.pdf

# Estou movendo o arquivo para o /tmp/ e mantendo seu nome.
linux:~/$ mv linux_admin.pdf /tmp/

# Estou movendo o arquivo para o /tmp/ e mantendo seu nome
# (igual a opção acima)
linux:~/$ mv linux_admin.pdf /tmp/linux_admin.pdf

# Estou movendo o arquivo para o /tmp/ e mudando seu nome durante o ato de mover.
linux:~/$ mv linux_admin.pdf /tmp/nag2.pdf


TOUCH


Sua principal função é mudar o timestamp de um objeto, mas sua função mais usada é criar um arquivo em branco. Isso acontece porque, ao mudar o timestamp de um arquivo, se esse arquivo não existir, ele cria o arquivo (cria o arquivo vazio).

Opções:

-m  Altera a data de modificação;
-a Altera a data de acesso;
-t Usa o formato timestamp (ANODIAMÊSHORA = 201912061425 = 2019/12/06 às 14:25);
-d Usa formato humano.

Exemplos:

# Altera a data de modificação, acesso e alteração:
linux:~/$ touch nomes.txt

# Altera a data de acesso e modificação para o
# ano de 2018, mês 08, dia 31 às 14:23:23
linux:~/$ touch -t "201808311423.23" nomes.txt

# Tanto a opção '-a' como a opção '-m', não recebem nenhum argumento.

# Altera a data/hora de acesso para data/hora atual do sistema
# (altera a data de alteração também):
linux:~/$ touch -a nomes.txt

# Altera apenas a data/hora de acesso para o
# ano de 2018, mês 12, dia 31 às 14:23:23
linux:~/$ touch -a -t "201812311423.23" nomes.txt

# Altera a data/hora de modificação e alteração
# para data/hora atual do sistema
linux:~/$ touch -m nomes.txt

# Altera apenas a data/hora de modificação para o ano
# de 2019, mês 05, dia 15 às 15:00:00
linux:~/$ touch -m -t "201905151500.00" nomes.txt

# Altera a data/hora de modificação e acesso para
# o ano atual, mudando apenas o mês e hora:
linux:~/$ touch -d "February 1 01:09" nomes.txt


RM


É usado para remoção de arquivos e diretórios.


Opções:

-i  (interativo ou interactive): Pergunta se quer remover;
-v Verbose, mostra enquanto excluí;
-r Recursivo, usado para remoção de diretório, excluí tudo dentro do diretório.
-f Força a exclusão;
-d Remove diretório vazio (rmdir).

Exemplos:

# Remove o arquivo sem perguntar;
linux:~/$ rm nome_do_arquivo

# Pergunta antes de remover;
linux:~/$ rm -i nome_do_arquivo

# Mostra todos os arquivos que estão sendo excluídos;
linux:~/$ rm -v nome_do_arquivo(s)

O rm é usado para remoção de arquivos e diretórios, mas para que seja possível remover um diretório, deve ser usado a opção '-r' (Recursive), isso acontece porque na maioria das vezes os diretórios possuem arquivos, por isso a opção recursivo, o que será feito com o diretório, será aplicado (repetido) com o que estiver dentro dele.


Mesmo estando vazio você deve usar o '-r', isso porque, se estiver vazio, em teoria, deve ser usado o 'rmdir' ou rm -d'.

linux:~/$ rm -r diretório

# Excluir um diretório.


RMDIR


Usado para excluir diretórios vazios e apenas diretórios vazios.

linux:~/$ rmdir diretório

# Excluir diretório vazio


MKDIR


Usado para criação de diretórios no Linux

Opção:

-p  Cria uma árvore de diretório.

Exemplo:

linux:~/$ mkdir nome_do_diretório

# Criando apenas um diretório

Por padrão, o mkdir só cria um diretório, caso você queira criar mais de um diretório ou se for preciso criar um diretório dentro de outro diretório que não exista ainda, é usado a opção -p (parents).

linux:~/$ mkdir -p dir1/dir2

# Criando mais de um diretório simultaneamente.
# Dessa forma, será criado dir1 e dentro dele será criado dir2.


FIND


Usado para fazer buscas no Linux, dessa forma, é possível fazer buscas em arquivos/diretórios usando uma gama de possibilidades bem vasta.


Opções:

-i          Ignora case sensitive;
-name Nome do que será procurado (objeto);
-user Pesquisa por usuário (objeto tem como dono esse usuário);
-group Pesquisa por grupo (objeto tem como grupo o grupo especificado);
-maxdepth Até quantos subdiretórios ele vai buscar;
-mindepth Começa a busca depois de N diretórios;
-empty Procura por arquivos e diretórios vazios;
-perm Procura por permissão;
-cmin Pesquisa por arquivos com status alterados usando a opção de minutos;
-ctime Pesquisa por arquivos com status alterados usando a opção de dias;
-amin Pesquisa por arquivos acessados usando a opção de minutos;
-atime Pesquisa por arquivos acessados usando a opção de dias;
-mmin Pesquisa por arquivos modificados usando a opção de minutos;
-mtime Pesquisa por arquivos modificados usando a opção de dias;
-type Pesquisa por tipo de objeto.

Tipos de objetos:

b - Objeto do tipo bloco;
c - Objeto do tipo caractere;
d - Objeto do tipo diretório;
f - Objeto do tipo arquivo comum;
l - Objeto do tipo link simbólico.

Atributos específicos

-user USERNAME Pesquisa por arquivos pertencentes ao usuário USERNAME.
-group GROUPNAME Pesquisa por arquivos pertencentes ao grupo GROUPNAME.
-readable Pesquisa por arquivos que podem ser lidos pelo usuário atual.
-writable Pesquisa por arquivos que podem ser gravados pelo usuário atual.
-executable Pesquisa por arquivos que são executáveis pelo usuário atual.
No caso de diretórios, isso corresponderá a qualquer diretório que o
usuário possa inserir (permissão x).
-perm NNNN Isso corresponderá a quaisquer arquivos que tenham exatamente a permissão
NNNN. Por exemplo, -perm 0664 irá corresponder a quaisquer arquivos que o
usuário e grupo possam ler e escrever e que outros possam ler
(ou rw-rw-r--).

Alguns modelos de busca com FIND:

# Faz uma busca na sua HOME, buscando tudo que tenha '.txt'.
linux:~/$ find /home/$USER/ -name "*.txt"

# Procura e exclui imediatamente.
# Faz um busca por '.txt' na HOME e exclui os arquivos.
linux:~/$ find /home/$USER/ -name "*.txt" -exec rm -i {} \;

# Procura arquivos e diretórios vazios na sua HOME.
linux:~/$ find /home/$USER/ -empty

# Pesquisa por arquivos com mais de 1 giga,
# iniciando a pesquisa no diretório corrente.
linux:~/$ find . -type f -size +1G

# Pesquisa por arquivos menores que 1 Giga
linux:~/$ find . -type f -size -1G

# Pesquisa por arquivos com exatamente 1 Giga
linux:~/$ find . -type f -size 1G

# Pesquisa por arquivos de texto, e exibe apenas os arquivos
# que tem teste escrito no '.txt'.
linux:~/$ find /home/$USER/ -iname "*.txt" -exec grep -Hin "teste" {} \;

Pesquisando e executando um comando nos arquivos encontrador

linux:~/$ find /home/$USER/ -type f -name "*.txt" -exec echo "Achado: " {} \;

Pesquisa feita na HOME find /home/$USER/, procurando arquivos que tenham '.txt' -name "*.txt", sendo arquivos do tipo comum (Arquivos de texto (-type f)), após isso executa um 'echo' para cada linha encontrada -exec echo "Achado: " {} \;.


Opções do grep que foram usadas acima:

-H       Exibe o nome do arquivo com o caminho;
-i Ignora case sensitive;
-n Exibe o número da linha que teve a ocorrência.

Algumas opções do find como: amin, atime, cmin dentre outras, são passadas com o uso de um número, esse número representa os dias ou os minutos (falaremos da representação por dia), por exemplo: 1 é igual a 24 horas, ou seja, o uso dessas opções com o número 1 significa um dia, isso porque um dia tem 24 horas.

Então, se você quiser pesquisar por 3 dias, você usa o número 3, porque cada dia tem 24 horas, se for por cinco dias, usa o número 5 e por aí vai.


Variação decorrente de cada dia:

Como foi explicado acima, você pode usar esses dias com o símbolo de adição + ou com o símbolo de subtração -, se for usado o símbolo de adição, isso significa que o tempo (em dias ou em minutos) é maior do que o especificado e se for usado o símbolo de subtração, o tempo é menor do que o especificado, exemplos:

+5  = Mais de cinco dias;
-10 = Menos de dez dias;
7 = Exatamente 7 dias.

Isso serve para minutos também, segue a mesma linha de raciocínio, somente mudam as opções que buscam por dia ctime, atime e mtime ou por minuto cmim, amim e mmim. Dessa maneira, podemos criar métodos de busca mais completos.

# Pesquisa por arquivos acessados a menos de 5 minutos
linux:~/$ find . -type f -amin -5

# Pesquisa por arquivos acessados a menos de 1 dia
linux:~/$ find . -type f -atime -1

# Pesquisa por arquivos com o status alterado a menos de 1 dia
linux:~/$ find . -type f -ctime -1

Crie alguns dados, usando os comandos abaixo:

linux:~/$ mkdir -p pasta1/pasta2/pasta3/pasta4/pasta5/pasta6/pasta7

linux:~/$ touch pasta1/pasta2/pasta3/achei

linux:~/$ touch pasta1/pasta2/pasta3/pasta4/pasta5/pasta6/pasta7/achei

O MAXDEPTH dita até quantos subdiretórios a busca será feita, vale ressaltar que, quando o find vai fazer a busca, ele primeiro olha o diretório como um objeto e depois ele entra no diretório para buscar objetos dentro dele, exemplos:

# Esse comando não vai retornar nada, porque o find
# só olhou o terceiro diretório como objeto e não como pasta.
linux:~/$ find . -maxdepth 3 -iname "achei" 2>/dev/null

# Para simplificar isso, digite o comando abaixo,
# usaremos a opção '-ls' no início do comando
# (Há diferença se você coloca essa opção no começo ou no final),
# dessa forma, podemos exibir o que o find analisou.

linux:~/$ find . -ls -maxdepth 3 -name "achei" 2>/dev/null
21501536 4 drwxrwxr-x 3 USER USER 4096 Jun 30 07:24 .
21501851 4 drwxrwxr-x 3 USER USER 4096 Jun 30 07:47 ./pasta1
21501852 4 drwxrwxr-x 3 USER USER 4096 Jun 30 07:47 /pasta1/pasta2
21501854 4 drwxrwxr-x 3 USER USER 4096 Jun 30 07:25 ./pasta1/pasta2/pasta3

# Com isso, podemos ver que o find, olha a pasta3,
# mas ele não entra dentro da pasta3, ele a vê apenas como um arquivo,
# vendo se ela não é o que estamos procurando.
# Agora, se adicionarmos mais um subdiretório para pesquisa,
# aí sim o find irá “entrar” dentro de pasta3 para fazer uma busca.

linux:~/$ find . -maxdepth 4 -name "achei" 2>/dev/null
./pasta1/pasta2/pasta3/achei

# Rode o mesmo comando com '-ls' para ver que ele entra na pasta3.

# Fazendo uma busca mais profunda em pastas
linux:~/$ find . -maxdepth 8 -name "achei" 2>/dev/null
./pasta1/pasta2/pasta3/pasta4/pasta5/pasta6/pasta7/achei
./pasta1/pasta2/pasta3/achei

Pesquisando usando os atributos:

# Pesquisando usando a permissão completa:
$ find . -perm 644
./.bash_logout
./.bash_profile
./.bashrc

# Pesquisando usando o user:
$ find . -user vagrant
.
./.bash_logout
./.bash_profile
./.bashrc
./.ssh
./.ssh/authorized_keys
./.lesshst
./.bash_history
./arquivo
./.viminfo

# Pesquisando usando o group:
$ find . -group vagrant
.
./.bash_logout
./.bash_profile
./.bashrc
./.ssh
./.ssh/authorized_keys
./.lesshst
./.bash_history
./arquivo
./.viminfo

# Pesquisando usando o readable:
$ find . -readable
.
./.bash_logout
./.bash_profile
./.bashrc
./.ssh
./.ssh/authorized_keys
./.lesshst
./.bash_history
./arquivo
./.viminfo

# Pesquisando usando o writable:
$ find . -writable
.
./.bash_logout
./.bash_profile
./.bashrc
./.ssh
./.ssh/authorized_keys
./.lesshst
./.bash_history
./arquivo
./.viminfo

# Pesquisando usando o executable:
$ find . -executable
.
./.ssh
# Bom para procurar scripts (Criei um script):
$ find . -executable
.
./.ssh
./script1


STAT


Exibe informações sobre arquivos e diretórios, as informações exibidas mais usadas são: data de acesso, de modificação, alteração, número inode entre outras informações.

  • Data de Acesso A data de acesso é alterada quando o conteúdo do arquivo for acessado, por exemplo, por meio de editores de texto. Também pode ser feito usando o comando 'touch'.

  • Data de Modificação A data de modificação é alterada quando se modifica o arquivo, por exemplo, mudando alguma coisa dentro dele. Também pode ser feito usando o comando 'touch'.

  • Data de Alteração Essa data, representa o status do arquivo/diretório, ela muda quando é alterado a data de modificação, mudando as permissões e até mesmo dono e grupo dono do objeto.


Como ver a data de criação?

O comando stat não exibe a data de criação, essa opção fica em branco, mas podemos saber a data em que foi criado o objeto, ao rodar o comando stat, observe o campo 'inode', pegue o número que estiver nele:

linux:~/$ stat teste.txt
Arquivo: 'teste.txt'
Tamanho: 0 Blocos: 0 Bloco IO: 4096 arquivo comum vazio
Dispositivo: 801h/2049d Inode: 21501537 Links: 1
Acesso: (0664/-rw-rw-r--) Uid: ( 1006/USER) Gid: ( 1006/ USER)
Acessar: 2018-08-31 14:23:23.000000000 -0300
Modificar: 2018-08-31 14:23:23.000000000 -0300
Alterar: 2019-06-20 07:12:24.471085247 -0300
Nascimento: -

Agora vamos usar o comando debugfs -R 'stat <NUMERO>' SISTEMA_de_ARQUIVOS, exemplo:

linux:~/$ sudo debugfs -R 'stat <21501537>' /dev/sda1
Inode: 21501537 Type: regular Mode: 0664 Flags: 0x80000
Generation: 2578143794 Version: 0x00000000:00000001
User: 1006 Group: 1006 Size: 0
File ACL: 0 Directory ACL: 0
Links: 1 Blockcount: 0
Fragment: Address: 0 Number: 0 Size: 0
ctime: 0x5d0b5c08:7050c2fc -- Thu Jun 20 07:12:24 2019
atime: 0x5b89798b:00000000 -- Fri Aug 31 14:23:23 2018
mtime: 0x5b89798b:00000000 -- Fri Aug 31 14:23:23 2018
crtime: 0x5d0b5b75:17cc6834 -- Thu Jun 20 07:09:57 2019
Size of extra inode fields: 32
EXTENTS:

Observe a opção crtime, que significa 'create time', ela mostra a data de criação do objeto.

É explicado um pouco sobre



CARACTERES CURINGA


Muitas vezes é necessário fazer uma busca, uma listagem ou até mesmo criações de vários objetos, isso se torna maçante se tiver que ser feito mais de uma vez, por isso, para esses tipos de trabalho, usamos os caracteres coringa.

OBS.: Para uso de tais caracteres, os objetos a serem listados, devem ter algo em comum, uma espécie de prefixo, que possa abranger a todos que o tenha.

Ex: Vários arquivos num sistema que tem o nome começando por 'projeto-1', todos os arquivos que tiverem esse nome, possuem um prefixo projeto-1 e logo são do mesmo projeto, sendo assim, podemos usar os caracteres coringa neles.

Os caracteres coringa são:

Caractere   Nome
{} Chaves
[] Lista
? Interrogação
* Asterisco

CHAVES {}

As chaves possuem um funcionamento parecido com a lista, mas seu maior destaque é durante a criação de pastas e arquivos, por exemplo, crie vários arquivo com nome projeto-1 até projeto-20.

Para criar, poderíamos fazer isso um a um, mas com as chaves, podemos criar todos de uma só vez.

linux:~/$ touch projeto-{1..20}

# Criando projeto-1 até projeto-20.

O ponto ponto .., funciona como um "até", partindo de um ponto e indo até o outro ponto.


As chaves funcionam também na listagem, por exemplo:

linux:~/$ ls projeto-{7..15}
projeto-10 projeto-11 projeto-12 projeto-13 projeto-14 projeto-15 projeto-7 projeto-8 projeto-9

Perceba que funcionou, o seu resultado pode estar desordenado, mas funcionou.


As chaves, assim como a lista, também aceitam caracteres individuais para pesquisa, mas para pesquisar nas chaves, você deve separar tudo que for um caractere individual por uma vírgula, exemplo:

linux:~/$ ls projeto-{1,9}
projeto-1 projeto-9

# Esse comando, pesquisa projeto-1 e projeto-9,
# porque o 1 e 9 estão separados por vírgula.

Você pode também ir adicionando outras chaves, por exemplo:

linux:~/$ ls projeto-{1..3}-Part_{0..2}
ls: não foi possível acessar 'projeto-1-Part_0': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-1-Part_1': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-1-Part_2': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-2-Part_0': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-2-Part_1': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-2-Part_2': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-3-Part_0': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-3-Part_1': Arquivo ou diretório inexistente
ls: não foi possível acessar 'projeto-3-Part_2': Arquivo ou diretório inexistente

# Em vermelho no resultado acima, está os nomes de
# arquivos que o 'ls' tentou procurar.

Como esses arquivos não existem, o comando deu erro, mas serve para vermos o que ele iria pesquisar.


LISTA [ ]

A lista é muito seletiva, ela só dá match com o que estiver dentro dela e com uma certa limitação, diferente das chaves, a lista não serve para ser usada durante a criação de um objeto, apenas para listagem.

Crie alguns arquivos

- - - Criação dos arquivos pata, pate, pati, pato, patu

# Criando vários arquivos com um prefixo e variando as vogais.
linux:~/$ touch pat{a,e,i,o,u}

linux:~/$ ls
pata pate pati pato patu

Perceba que se fosse usado as chaves da forma 'pat{a..u}', seria usado o alfabeto para criar os arquivos, dessa forma teríamos arquivos como os listados abaixo e não como foram criados:

pata
patb
patc
patd
pate
patf
patg
path
pati
patj
patk
patl
patm
patn
pato
patp
patq
patr
pats
patt
patu

Agora vamos listar os arquivo que terminam com E,I e U:

# listagem de alguns arquivos que terminam com vogal:
linux:~/$ ls pat[eiu]
pate pati patu

# Perceba que cada arquivo dentro da lista, é considerado um caractere individual.

Outra forma de listagem, é a listagem negada, como assim? tudo o que estiver dentro da lista não será listado, para isso, usamos o sinal de exclamação ou Acento circunflexo, como é usado nas Expressões Regulares.

# Listagem negando os arquivos, usando Sinal de Exclamação.
linux:~/$ ls pat[!eiu]
pata pato

# Listagem negando os arquivos, usando Acento circunflexo.
linux:~/$ ls pat[^eiu]
pata pato

Tanto o sinal de exclamação como o acento circunflexo, representam a exclusão de caracteres dentro da lista.

Como usar um "até" na lista? ao invés de usar o ponto ponto como o das chaves, na lista usa-se o traço-.

# Listagem usando um “até”
linux:~/$ ls pat[a-u]

Perceba que será usado todas as letras do alfabeto para pesquisa, como só temos as vogais, somente elas serão pesquisadas.

Outra diferença entre a lista e as chaves, é que se for usado as chaves para listagem, e alguns ou todos os arquivos procurados não existirem, o comando 'LS' retorna um erro, já a lista não, se houver apenas 1 match, ela não exibe erro, agora se não houver match nenhum, ai o 'LS' exibe erro.


Podemos usar alguns truques ao utilizar a lista, por exemplo:

Ao invés de criar uma lista contendo todos os números (de 0 até 9) podemos informar que é de 0 até 9 de uma forma diferente, como:

Forma feia de fazer:    [0123456789]
Forma bonita de fazer: [0-9]

Essas duas formas abrangem números de 0 até 9, isso porque traço funciona dizendo que "vai até" algum caractere.

Abranger um alfabeto (como fazer):

Maiúscula e Minúscula: [A-Za-z]
Minúscula: [a-z]
Maiúscula: [A-Z]

ASTERISCO *

O asterisco da match com muitos caracteres e em grande quantidade, não somente isso, ele é um coringa muito usado, isso acontece por causa da sua nobre função. Por exemplo, se você quiser apagar todos os arquivos de um diretório, mas não quer apagar o diretório, você usa o comando 'rm' com auxílio do asterisco, como abaixo:

# Apagando todos os arquivos e diretórios dentro do diretório atual.
linux:~/$ rm -r *

Fazendo listagem usando asterisco

Por dar match com tudo, é uma ótima ferramenta para listagem, mas tem que saber usar.

# Listando tudo que termina com '-release' dentro de /etc/
linux:~/$ ls /etc/*-release
/etc/lsb-release /etc/os-release

Com um comando, foi possível descobrir todos os arquivos que terminam com '-release' que estão dentro de '/etc'.

Más, e se você quiser exibir o conteúdo desses dois arquivos? basta dar um 'cat' usando o asterisco.

# Exibindo o conteúdo de tudo que termine com '-release' dentro de '/etc/'
linux:~/$ cat /etc/*-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.6 LTS"
NAME="Ubuntu"
VERSION="16.04.6 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.6 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

# Listando tudo que termine com 'ta':
linux:~/$ ls *ta
pata

Como pode ver, não importa a quantidade de caracteres que tenha e nem qual seja o caractere, o asterisco * vai dar match (apenas se o prefixo estiver correto e se der para dar match)

Não adianta listar tudo que comece com 'pa' sendo que não exista nada que comece com 'pa', vai retornar erro, por isso, o prefixo que une um ou vários objetos tem que existir.


INTERROGAÇÃO ?

O sinal de interrogação é bem simples e só casa somente com um único caractere, ele é muito utilizado quando se sabe o que pesquisar, porém, pode ocorrer variações no que está procurando, por exemplo:


Crie os arquivos usando o comando abaixo:

Comandos (Comandos encadeados criando arquivos):

# Comandos encadeados para criar alguns arquivos.
linux:~/$ touch bra{s,z}il && touch g{ar,}ota && touch pa{i,í}s

Agora vamos aos testes para que você possa ver como funciona o sinal de interrogação como um curinga.

linux:~/$ ls pa?s
pais país

Viu como ele age, você deve saber o que está procurando, porém, pode ter alguma variação em sua sintaxe.


Você se esqueceu em que língua criou seu arquivo chamado 'brasil' (se foi criado em português brasileiro ou em Inglês).

linux:~/$ ls bra?il
brasil brazil

# Dessa forma fica fácil de saber o que está procurando.

Vale ressaltar que, como o interrogação só funciona para um único caractere, você pode inserir mais interrogações que irão substituir mais caracteres.

linux:~/$ ls g??ota
garota

Perceba que, novamente, cada interrogação substitui apenas um e somente um único caractere, então você deve saber todas as letras e suas variações da string que deseja procurar, caso contrário, no menor descuido, vai dar erro na listagem.



TAR


O tar é um empacotador de arquivos, contendo diversos arquivos num arquivo final, ai você me pergunta, o que seria um empacotador de arquivos?

Imaginamos que uma loja fez uma venda pela Internet, nessa venda, o cliente comprou algumas coisas como camiseta, calça, meia, e alguns objetos a mais, a loja precisa empacotar esses produtos para ser entregue ao cliente, então um funcionário da loja vai e empacota tudo numa única caixa de papelão (supondo que caiba tudo lá dentro) e então manda para a transportadora, isso é uma analogia com o empacotador de arquivos, ele agrupa tudo num único objeto, e qualquer coisa que seja feito com esse objeto, ele irá carregar o que estiver dentro dele.

Perceba que é diferente de compactador, um empacotador apenas agrupa tudo num único objeto, já o compactador, também o faz, porém, ele comprime o arquivo final, deixa ele menor, menos pesado, seria como pegar essa caixa com os produtos do cliente e amassar ela, para deixá-la menor (talvez não seja uma boa ideia).

O bom de usar o tar é que ele usa compactadores, não precisando usar outro comando para compactar e descompactar, para isso, usamos opções.

Opções:

--delete    Deleta um arquivo que esteja dentro de um arquivo empacotado;
-c Cria um novo arquivo (empacota, e pode ser compactado);
-x Extrai os arquivos;
-t Lista os arquivos dentro do tar;
-v Modo verbose;
-p Preserva as permissões;
-f Define o nome do arquivo;
-r Adiciona arquivos a um arquivo .tar já criado;
-j Compacta usando o algoritmo bzip2 (bz2);
-J Compacta usando o algoritmo xz;
-z Compacta usando o algoritmo gzip (gz);

Crie alguns arquivos com o comando baixo:

# Criando arquivos
linux:~/$ touch redacao_part{1..6}

Agora vamos agrupar os arquivos:

# Agrupando os arquivos da redação
linux:~/$ tar -cvf redacao.tar redacao_part{1..5}

Agora vamos listar o conteúdo do arquivo tar:

linux:~/$ tar -tf redacao.tar
redacao_part1
redacao_part2
redacao_part3
redacao_part4
redacao_part5

Agora vamos adicionar mais um arquivo dentro do 'redacao.tar', lembrando que isso só é possível porque o arquivos está empacotado e não compactado, se estiver compactado não é possível adicionar mais arquivos.

linux:~/$ tar -rf redacao.tar redacao_part6

Agora liste novamente e verá que a parte 6 está dentro do arquivo 'redacao.tar'.


Remover um arquivo que esteja dentro de um arquivo.tar.

linux:~/$ tar --delete redacao_part{1..5} -f redacao.tar

Ao listar novamente, verá que só ficou a parte 6 da redação.


Até agora só agrupamos os arquivos, vamos compacta-los.

Primeiro, remova o arquivo existente:

linux:~/$ rm redacao.tar

Temos duas formas de compactar o arquivo, a primeira é criar o arquivo tar e depois compactar (menos usual) e a segunda é criar o arquivo tar compactando ele (mais usual).

# Criando um arquivo '.tar', compactado com gzip.
linux:~/$ tar -cvzf redacao.tar.gz redacao_part{1..5}

# Criando um arquivo '.tar', compactado com xz.
linux:~/$ tar -cvJf redacao.tar.xz redacao_part{1..5}

# Criando um arquivo '.tar', compactado com bzip2.
linux:~/$ tar -cvjf redacao.tar.bz2 redacao_part{1..5}

## Descompactando

# Descompactando um arquivo '.tar', compactado com gzip.
linux:~/$ tar -xvzf redacao.tar.gz redacao

# Descompactando um arquivo '.tar', compactado com xz.
linux:~/$ tar -xvJf redacao.tar.xz redacao

# Descompactando um arquivo '.tar', compactado com bzip2.
linux:~/$ tar -xvjf redacao.tar.bz2 redacao


CPIO


Serve para agrupar (igual o tar), porém, seu funcionamento é bem diferente, ele só agrupa através de redirecionamento de saída padrão, ou seja, pega a saída de outro comando para agrupar.

Opções:

-o  Cria o arquivo;
-i Extrai os arquivo;
-d Cria os diretórios principais (caso eles não existam);
-A Anexa arquivos ao fim de um arquivo existente;
-F Informa o arquivo;
-t Lista o conteúdo do arquivo.cpio.

Uma forma mais simplista de usar o CPIO é fazendo com que ele busque os arquivos a partir de um arquivo.txt, dentro de um arquivo de texto coloque as linhas abaixo:

--- Dados do arquivo de texto

/etc/passwd
/etc/group

Agora rode o comando abaixo para agrupar:

linux:~/$ cpio -o < arquivo.txt > backup.cpio

# Dessa forma, todos os caminhos de arquivos que estiverem dentro
# do arquivo de texto serão agrupados.

Você pode usar um 'cpio -t < backup.cpio' para listar seu conteúdo.

linux:~/$ cpio -i < bakcup.cpio

# Desagrupando

Adicionando mais arquivos dentro de um arquivo '.cpio':

Para isso, apague o conteúdo de 'arquivo.txt' e adicione /etc/shadow.

# Adicionando /etc/shadow no backup.
linux:~/$ sudo cpio -Ao < arquivo.txt -F backup.cpio

# Listando seu conteúdo:
linux:~/$ cpio -t < backup.cpio
/etc/passwd
/etc/group
/etc/shadow

Compactando um arquivo '.cpio'

Para o cpio, temos duas formas de compactar (igual ao tar), porém, nenhum delas é através de parâmetros.


Compatando usando compactadores

Para isso, utilizamos os algoritmos de compactação separadamentevamos, sem envolver o cpio como um comando.

Compactando usando compactadores e cpio juntos

No momento em que formos agrupar, redirecionamos a saída do cpio (usando pipe) para algum dos compactadores, dessa forma ele fará a compactação do pacote '.cpio' (essa forma não será apresentada).

Todos os algoritmos apresentados, seguem a mesma forma para compactar e descompactar, são eles: GZIP, BZIP2, XZ.


Compatando usando compactadores:

# Compactando usando o gzip.
linux:~/$ gzip backup.cpio

# Compactando usando o bzip2
linux:~/$ bzip2 backup.cpio

# Compactando usando o xz.
linux:~/$ xz backup.cpio

### Listando ###

# Arquivo gzip:
linux:~/$ ls
arquivo.txt backup.cpio.gzip

# Arquivo bzip2:
linux:~/$ ls
arquivo.txt backup1.cpio.bz2

# Arquivo xz:
linux:~/$ ls
arquivo.txt backup2.cpio.xz

Perceba que ao compactar, o arquivo empacotado sumiu, para manter o arquivo empacotado, precisamos usar o argumento -k.

Mantendo o arquivo agrupado:

# Compactando usando o gzip.
linux:~/$ gzip -k backup.cpio

# Compactando usando o bzip2
linux:~/$ bzip2 -k backup.cpio

# Compactando usando o xz.
linux:~/$ xz -k backup.cpio

### Listando ###

# Arquivo gzip:
linux:~/$ ls
arquivo.txt backup.cpio.gzip backup.cpio

# Arquivo bzip2:
linux:~/$ ls
arquivo.txt backup1.cpio.bz2 backup.cpio

# Arquivo xz:
linux:~/$ ls
arquivo.txt backup2.cpio.xz backup.cpio

Descompactando:

Temos duas formas de descompactar esses algoritmos, uma das formas é usando um outro comando, que é uma variação do comando de compactação e a outra forma é através de parâmetros.

### Usando parâmetros:

# Descompactando usando o gzip.
linux:~/$ gzip -d backup.cpio

# Descompactando usando o bzip2
linux:~/$ bzip2 -d backup.cpio

# Descompactando usando o xz.
linux:~/$ xz -d backup.cpio

### Usando outro comando

# Descompactando usando o gzip.
linux:~/$ gunzip -k backup.cpio

# Descompactando usando o bzip2
linux:~/$ bunzip -k backup.cpio

# Descompactando usando o xz.
linux:~/$ unxz -k backup.cpio

O uso do -k faz com que o algoritmo de compactação mantenha o arquivo original após a compactação/descompactação.



DD


O comando DD realizar uma cópia bit a bit, pode ser usado para copiar uma partição inteira, arquivos e etc.

Opções:

if=origem           É a origem;
of=destino É o destino;
bs=N Tamanho dos blocos;
count=N Quantas vezes o bloco será copiado;
status=progress Exibe o progresso.

Sintaxe simples: sudo if=Local_origem of=Local_Destino

# Copiando uma ISO para uma partição USB
linux:~/$ sudo dd if=/home/USER/Downloads/linuxmint-19.1-cinnamon-64bit.iso of=/dev/sdb1 bs=4M status=progress

# Copiando um CD/DVD para uma ISO
linux:~/$ sudo dd if=/dev/sr0 of=img.iso bs=2048 status=progress

Criar um "HD" virtual:

# Cria um dispositivo de bloco com tamanho de 1G chamado part
linux:~/$ sudo dd if=/dev/zero of=/home/USER/part bs=1M count=1000

Isso é usado para criar uma “partição” dentro do disco, onde você pode criptografar essa “partição”, você pode usar o /dev/zero para formatar discos inteiros também.


Formatar um disco

linux:~/$ sudo dd if=/dev/zero of=of=/dev/sbd1