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_diretoriomkdir: 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_filhomkdir: 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 dir3mkdir: 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 existsCriando 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.txtQuando o arquivo passado como argumento existe, touch apenas atualiza os metadados do arquivo.
touch arquivo.txtMúltiplos argumentos são suportados.
touch um_diretorio/arquivo.txt arquivo2.txt ./arquivo3.txtMovendo 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.txtrenamed 'arquivo.txt' -> 'arquivo1.txt'Renomear diretório segue a mesma regra.
mv -v um_diretorio dir4renamed '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 dir1renamed 'arquivo1.txt' -> 'dir1/arquivo1.txt'Diretório diretorio_pai é movido para o diretório dir2.
mv -v diretorio_pai dir2renamed '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.txtrenamed 'arquivo2.txt' -> 'dir1/novo_arquivo2.txtDiretó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 dir4renamed '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.txtrenamed '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 dir1ls: cannot access 'arquivo2.txt': No such file or directoryCopiando 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 filePara 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.txtremoved 'dir1/arquivo1.txt'Para excluir diretórios a opção -r é necessária.
rm -vr dir4/dir3removed directory 'dir4/dir3'⚠️ Quando um diretório é removido, todos os arquivos/diretórios abaixo dele também são excluídos.
rm -vr dir5removed '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 '.'