Manipulando arquivos: cp, mv, rm, mkdir, touch
1. Introdução ao gerenciamento de arquivos no shell
1.1. O shell como gerenciador de arquivos
O shell Bash oferece uma interface poderosa para manipular arquivos e diretórios diretamente pelo terminal. Comandos como cp, mv, rm, mkdir e touch formam o núcleo das operações básicas de gerenciamento de arquivos. Diferente de interfaces gráficas, o shell permite automação, scripts e operações em lote com grande eficiência.
1.2. Estrutura de caminhos
No shell, existem dois tipos de caminhos:
- Caminho absoluto: começa com
/e especifica a localização completa a partir da raiz do sistema. - Caminho relativo: baseia-se no diretório atual (representado por
.) e no diretório pai (representado por..).
# Exemplos de caminhos
/home/usuario/documentos/arquivo.txt # Absoluto
documentos/arquivo.txt # Relativo (se estiver em /home/usuario)
../documentos/arquivo.txt # Relativo subindo um nível
1.3. Cuidados iniciais
Antes de começar a manipular arquivos, configure aliases seguros para evitar acidentes:
# Adicione ao ~/.bashrc para proteção extra
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
Esses aliases forçam uma confirmação antes de sobrescrever ou remover arquivos.
2. Criando diretórios e arquivos: mkdir e touch
2.1. mkdir: criando diretórios
O comando mkdir cria diretórios. A opção -p permite criar diretórios aninhados de uma só vez:
# Criar um diretório simples
mkdir projetos
# Criar diretórios aninhados
mkdir -p projetos/2024/bash/scripts
# Criar múltiplos diretórios
mkdir fotos videos documentos
2.2. touch: criando arquivos vazios
O comando touch cria arquivos vazios ou atualiza timestamps de arquivos existentes:
# Criar arquivos vazios
touch README.md
touch script.sh config.txt
# Atualizar timestamp de um arquivo existente
touch README.md
# Criar múltiplos arquivos de uma vez
touch {a,b,c}.txt
2.3. Exemplo prático: estrutura de projeto
# Criar estrutura completa de um projeto web
mkdir -p projeto/{css,js,img,fonts}
touch projeto/index.html
touch projeto/css/style.css
touch projeto/js/script.js
touch projeto/README.md
3. Copiando arquivos e diretórios: cp
3.1. Sintaxe básica
# Copiar um arquivo
cp origem.txt destino.txt
# Copiar para outro diretório
cp arquivo.txt /home/usuario/backup/
# Copiar múltiplos arquivos para um diretório
cp arquivo1.txt arquivo2.txt arquivo3.txt destino/
3.2. Opções essenciais
# Copiar diretório recursivamente (-r)
cp -r projetos/ backup_projetos/
# Modo interativo (-i): pergunta antes de sobrescrever
cp -i arquivo.txt destino/
# Modo verboso (-v): mostra o que está sendo copiado
cp -v *.txt documentos/
3.3. Preservando atributos
# Preservar permissões e timestamps (-p)
cp -p script.sh backup_script.sh
# Modo archive (-a): preserva tudo recursivamente
cp -a diretorio_original/ diretorio_copia/
4. Movendo e renomeando: mv
4.1. Diferença entre mover e renomear
O mesmo comando mv realiza ambas as operações:
# Renomear arquivo
mv arquivo_antigo.txt arquivo_novo.txt
# Mover arquivo para outro diretório
mv arquivo.txt /home/usuario/documentos/
# Mover e renomear simultaneamente
mv arquivo.txt /home/usuario/documentos/novo_nome.txt
4.2. Opções úteis
# Interativo: pergunta antes de sobrescrever
mv -i arquivo.txt destino/
# Verboso: mostra o que está sendo movido
mv -v *.txt pasta_destino/
# Não sobrescrever arquivo existente (-n)
mv -n arquivo.txt destino/
4.3. Movendo diretórios
# Mover diretório inteiro
mv projetos/ /home/usuario/arquivados/
# Mover conteúdo de um diretório para outro
mv pasta1/* pasta2/
5. Removendo arquivos e diretórios: rm
5.1. Sintaxe básica
# Remover arquivo simples
rm arquivo.txt
# Remover usando curingas
rm *.tmp
rm arquivo?.txt
rm [a-c]*.txt
5.2. Opções críticas
# Remover diretório recursivamente (-r)
rm -r pasta_antiga/
# Forçar remoção sem confirmação (-f)
rm -f arquivo_protegido.txt
# Interativo: perguntar antes de cada remoção (-i)
rm -i *.log
# Combinar opções (cuidado!)
rm -rf diretorio/
5.3. Cuidados de segurança
O comando rm -rf é extremamente perigoso. Práticas seguras incluem:
# Usar trash-cli como alternativa segura
# Instalar: sudo apt install trash-cli
trash-put arquivo.txt
trash-list
trash-empty
# Sempre verificar antes de remover
ls -la diretorio_para_remover/
rm -ri diretorio_para_remover/
6. Combinando comandos e boas práticas
6.1. Curingas (glob patterns)
# * - qualquer sequência de caracteres
cp *.txt documentos/
# ? - um caractere qualquer
rm arquivo?.tmp
# [] - conjunto de caracteres
mv [abc]*.txt pasta_a/
# {} - expansão de chaves
mkdir -p {2020,2021,2022}/{janeiro,fevereiro,marco}
6.2. Redirecionamento e pipes
# Listar e copiar arquivos específicos
ls *.txt | xargs cp -t backup/
# Encontrar e remover arquivos antigos
find . -name "*.log" -mtime +30 -delete
# Contar arquivos antes de mover
ls pasta_origem/*.txt | wc -l
mv pasta_origem/*.txt pasta_destino/
6.3. Dicas importantes
# Usar -- para separar opções de argumentos
rm -- -arquivo_estranho.txt
# Usar . e .. para diretórios atual e pai
cp /etc/passwd ./backup_passwd
cd ..
# Confirmação visual com echo
echo "Movendo arquivos..."
mv *.txt destino/
echo "Operação concluída!"
7. Resumo e exercícios práticos
7.1. Tabela comparativa
| Comando | Função | Opções principais |
|---|---|---|
mkdir |
Criar diretórios | -p (aninhados) |
touch |
Criar/atualizar arquivos | (sem opções principais) |
cp |
Copiar arquivos/diretórios | -r, -i, -v, -p, -a |
mv |
Mover/renomear | -i, -v, -n |
rm |
Remover arquivos/diretórios | -r, -f, -i |
7.2. Exemplo prático completo
# 1. Criar estrutura de projeto
mkdir -p meu_projeto/{src,docs,tests}
touch meu_projeto/{README.md,LICENSE,.gitignore}
touch meu_projeto/src/{main.sh,utils.sh}
touch meu_projeto/docs/manual.txt
# 2. Fazer backup
cp -r meu_projeto meu_projeto_backup
# 3. Renomear arquivos
mv meu_projeto/src/main.sh meu_projeto/src/principal.sh
# 4. Remover arquivos temporários
rm meu_projeto/docs/manual.txt
# 5. Verificar resultado
ls -R meu_projeto/
7.3. Desafio prático
Crie um script que:
- Crie uma estrutura de diretórios:
backup/{2024,2025}/{jan,fev,mar} - Copie todos os arquivos
.txtdo diretório atual parabackup/2024/jan/ - Renomeie os arquivos copiados adicionando o prefixo
backup_ - Remova os arquivos
.txtoriginais - Exiba uma mensagem de conclusão
#!/bin/bash
# Solução do desafio
mkdir -p backup/{2024,2025}/{jan,fev,mar}
cp *.txt backup/2024/jan/
cd backup/2024/jan/
for arquivo in *.txt; do
mv "$arquivo" "backup_$arquivo"
done
cd ../..
rm *.txt
echo "Backup concluído com sucesso!"
Referências
- GNU Coreutils: cp invocation — Documentação oficial do GNU Coreutils sobre o comando cp, incluindo todas as opções e exemplos detalhados.
- GNU Coreutils: mv invocation — Documentação oficial do comando mv, abordando mover e renomear arquivos e diretórios.
- GNU Coreutils: rm invocation — Documentação oficial do comando rm com todas as opções de segurança e exemplos práticos.
- GNU Coreutils: mkdir invocation — Documentação oficial do comando mkdir, incluindo a opção -p para criação de diretórios aninhados.
- GNU Coreutils: touch invocation — Documentação oficial do comando touch para criação de arquivos e atualização de timestamps.
- Linuxize: How to Use cp Command in Linux — Tutorial prático e detalhado sobre o comando cp com exemplos do mundo real.
- HowtoForge: Linux rm Command Tutorial — Guia completo sobre o comando rm, incluindo práticas seguras e prevenção de acidentes.
- Trash-cli GitHub Repository — Projeto oficial do trash-cli, uma alternativa segura ao rm para gerenciamento de arquivos removidos.