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
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.
Já 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 argumento | Operação |
---|---|
Arquivo/diretório inexistente | Renomear |
Arquivo existente | Sobrescrever |
Diretório existente | Mover |
...diretório:
Último argumento | Operação |
---|---|
Arquivo/diretório inexistente | Renomear |
Arquivo existente | ❌ Erro |
Diretório existente | Mover |
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 '.'