Operações básicas em arquivos no Bash

Curso de Bash

Seção do curso de Bash sobre como criar (touch, mkdir), mover (mv), copiar (cp) e excluir (rm) arquivos e diretórios.

Capítulo abordando as operações em arquivos e diretórios mais comuns.

Conteúdo

  1. Nota sobre os comandos deste capítulo
  2. Criando diretório com mkdir
  3. Criando arquivos vazios com touch
  4. Movendo e renomeando arquivos com mv
  5. Copiando arquivos com cp
  6. Removendo arquivos com rm
  7. Exercícios

Nota sobre os comandos deste capítulo

touch, mkdir e rm recebem um ou mais argumentos. Cada argumento é processado individualmente já que não há dependência entre eles. Então caso um argumento seja inválido, os demais serão processados normalmente.

cp e rm recebem no mínimo dois argumentos. Os primeiros identificados como fonte e o último como destino.

  • Caso um dos arquivos/diretórios fonte seja inválido, os outros ainda serão processados.
  • Caso o arquivo/diretório destino seja inválido, nenhuma operação será executada.

Os comandos abaixo, como exceção de touch, utilizarão a opção -v para que suas operações sejam explicadas na saída.

Criando diretório com mkdir

mkdir cria diretórios caso já não existam.

Abaixo o diretório um_diretorio é criado sob o diretório atual.

mkdir -v um_diretorio
mkdir: created directory 'um_diretorio'

Diretórios pais podem ser criados juntos aos diretórios filhos com a opção -p.

mkdir -vp diretorio_pai/diretorio_filho
mkdir: created directory 'diretorio_pai'
mkdir: created directory 'diretorio_pai/diretorio_filho'

Múltiplos diretórios podem ser criados em um só comando.

mkdir -v dir1 dir2 dir3
mkdir: created directory 'dir1'
mkdir: created directory 'dir2'
mkdir: created directory 'dir3'

❌ É um erro enviar como argumento um diretório existente.

mkdir: cannot create directory ‘dir1’: File exists

Criando arquivos vazios com touch

touch é um comando utilizado para atualizar a data e hora da última modificação/acesso (metadados) de um arquivo.

Quando o arquivo passado como argumento não existe, touch cria o arquivo.

touch arquivo.txt

Quando o arquivo passado como argumento existe, touch apenas atualiza os metadados do arquivo.

touch arquivo.txt

Múltiplos argumentos são suportados.

touch um_diretorio/arquivo.txt arquivo2.txt ./arquivo3.txt

Movendo e renomeando arquivos com mv

mv serve para renomear, sobrescrever e mover arquivos e diretórios.

O comando suporta dois argumentos quando renomeando. Dois ou mais argumentos quando movendo.

O primeiro argumento, chamado de fonte, sempre deverá ser um arquivo ou diretório existente.

As seguintes tabelas sumarizam as operações de acordo com a existência do último argumento e se ele é arquivo ou diretório.

Quando o primeiro argumento é um...

...arquivo:

Último argumentoOperação
Arquivo/diretório inexistenteRenomear
Arquivo existenteSobrescrever
Diretório existenteMover

...diretório:

Último argumentoOperação
Arquivo/diretório inexistenteRenomear
Arquivo existente❌ Erro
Diretório existenteMover

A lista de arquivos e diretórios até então que será utilizada nos exemplos abaixo.

├── arquivo2.txt
├── arquivo3.txt
├── arquivo.txt
├── dir1
├── dir2
├── dir3
├── diretorio_pai
│   └── diretorio_filho
└── um_diretorio
    └── arquivo.txt

Renomeando

Renomeação ocorre quando o segundo argumento é um arquivo/diretório inexistente.

Abaixo arquivo.txt é renomeado para arquivo1.txt.

mv -v arquivo.txt arquivo1.txt
renamed 'arquivo.txt' -> 'arquivo1.txt'

Renomear diretório segue a mesma regra.

mv -v um_diretorio dir4
renamed 'um_diretorio' -> 'dir4'

❌ Renomear diretório com nome de arquivo existente é um erro. Abaixo o erro ao tentar-se renomear dir2 para (o arquivo existente) arquivo2.txt.

mv: cannot overwrite non-directory 'arquivo2.txt' with directory 'dir2'

Movendo

Para mover um arquivo ou diretório, o último argumento de mv deve ser um diretório existente (conhecido como diretório destino ou apenas destino).

Abaixo, arquivo1.txt é movido para o diretório dir1.

mv -v arquivo1.txt dir1
renamed 'arquivo1.txt' -> 'dir1/arquivo1.txt'

Diretório diretorio_pai é movido para o diretório dir2.

mv -v diretorio_pai dir2
renamed 'diretorio_pai' -> 'dir2/diretorio_pai'

Para mover e renomear em um mesmo comando, basta adicionar ao diretório destino o novo nome do arquivo/diretório.

dir1/novo_arquivo2.txt consta como inexistente já que apesar de dir1 ser um diretório existente, novo_arquivo2.txt não existe sob dir1.

mv -v arquivo2.txt dir1/novo_arquivo2.txt
renamed 'arquivo2.txt' -> 'dir1/novo_arquivo2.txt

Diretório atual . ou diretório pai .. podem ser utilizados como destino.

mv -v dir1/novo_arquivo2.txt .
renamed 'dir1/novo_arquivo2.txt' -> './novo_arquivo2.txt'

❌ Utilizar . ou .. no primeiro argumento é um erro.

mv: cannot move '.' to 'dir2/.': Device or resource busy

É possível mover vários arquivos e diretórios para um diretório destino. Destino é o último argumento, os demais são a origem (arquivos e diretórios a serem movidos).

Abaixo dir3 e arquivo3.txt são movidos para dir4.

mv -v dir3 arquivo3.txt dir4
renamed 'dir3' -> 'dir4/dir3'
renamed 'arquivo3.txt' -> 'dir4/arquivo3.txt'

Sobrescrevendo

Apenas arquivos podem ser sobrescritos.

Os dois argumentos abaixo existem antes do comando ser executado.

mv -v dir1/arquivo1.txt novo_arquivo2.txt
renamed 'dir1/arquivo1.txt' -> 'novo_arquivo2.txt'

arquivo1.txt passar a ter o nome novo_arquivo2.txt e o novo_arquivo2.txt anterior foi excluído.

ls dir1
ls: cannot access 'arquivo2.txt': No such file or directory

Copiando arquivos com cp

cp copia arquivos e diretórios.

O primeiro argumento, como em rm chamado de fonte, deve existir.

A cópia pode ter seu nome mantido ou um novo nome atribuído dependendo da existência do arquivo ou diretório do último argumento.

arquivo1.txt sob o diretório dir1 é copiado para o diretório atual com o nome mantido já que . representa um diretório.

cp -v dir1/arquivo1.txt .
'dir1/arquivo1.txt' -> './arquivo1.txt'

arquivo1.txt é copiado. A cópia recebe o nome novo_arquivo1.txt já que novo_arquivo1.txt não existe como arquivo/diretório.

cp -v arquivo1.txt novo_arquivo1.txt
'arquivo1.txt' -> 'novo_arquivo1.txt'

❌ Copiar para o mesmo diretório com o mesmo nome é um erro.

cp: 'dir1/arquivo1.txt' and 'dir1/arquivo1.txt' are the same file

Para copiar diretórios é necessária a opção -r/-R. Todos os arquivos e diretórios sob o diretório fonte serão copiados recursivamente.

O diretório dir1 é copiado para o diretório atual com o nome dir5.

cp -vr dir1 dir5
'dir1' -> 'dir5'
'dir1/arquivo1.txt' -> 'dir5/arquivo1.txt

Múltiplos arquivos/diretórios podem ser copiados para o diretório destino em um só comando.

O destino é o último argumento. Os argumentos anteriores são os arquivos/diretórios fonte.

cp -vr dir5 arquivo1.txt novo_arquivo1.txt dir1
'dir5' -> 'dir1/dir5'
'dir5/arquivo1.txt' -> 'dir1/dir5/arquivo1.txt'
'arquivo1.txt' -> 'dir1/arquivo1.txt'
'novo_arquivo1.txt' -> 'dir1/novo_arquivo1.txt'

Removendo arquivos com rm

rm remove arquivos e diretórios.

Para excluir um arquivo, basta enviá-lo como argumento.

arquivo1.txt sob o diretório dir1 é excluído.

rm -v dir1/arquivo1.txt
removed 'dir1/arquivo1.txt'

Para excluir diretórios a opção -r é necessária.

rm -vr dir4/dir3
removed directory 'dir4/dir3'

⚠️ Quando um diretório é removido, todos os arquivos/diretórios abaixo dele também são excluídos.

rm -vr dir5
removed 'dir5/arquivo1.txt'
removed directory 'dir5'

❌ Tentar remover o diretório atual . ou o diretório pai ..é um erro.

rm -r .
rm: refusing to remove '.' or '..' directory: skipping '.'

Exercícios

Selecione as afirmações verdadeiras

Dados os argumentos existentes meu_arquivo.txt ..
Dados os argumentos arq.txt novo_arq.txt onde o 1º é um arquivo e o 2º não existe
Dados os argumentos novo_arq.txt arq.txt onde o 1º não existe e o 2º é um arquivo
Dados os argumentos arq.txt dir onde o 1º argumento é um arquivo e o 2º é um diretório
Dados os argumentos dir novo_dir onde o 1º argumento é um diretório e o 2º não existe
Dados os argumentos dir1 dir2 onde o 1º e 2º argumentos são diretórios
Escrito por Caio Santesso.

Comentários

  • Conteúdo dos posts, exceto onde indicado contrário, licenciado sob a licença CC BY-SA 4.0 .