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:

  1. Crie uma estrutura de diretórios: backup/{2024,2025}/{jan,fev,mar}
  2. Copie todos os arquivos .txt do diretório atual para backup/2024/jan/
  3. Renomeie os arquivos copiados adicionando o prefixo backup_
  4. Remova os arquivos .txt originais
  5. 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