Gerenciamento Básico de Arquivos - cp, mv, rm, touch e Wildcards
O Que Você Vai Alcançar
- Usar as principais opções de
cp/mv/rm(-r-a-i-p-u-f) adequadamente - Criar arquivos vazios e atualizar timestamps com
touch - Criar e remover diretórios com segurança usando
mkdir -p/rmdir - Escrever wildcards (
*?[ ][!...]) e brace expansion ({ }) corretamente - Explicar que é o shell, e não o comando, que expande os globs
Este é o núcleo do objetivo 103.3 do LPIC-1 "Realizar gerenciamento básico de arquivos". Domine os padrões para executar as operações de arquivo que compõe a maior parte do trabalho diário sem acidentes.
Qual Comando e Opção Escolher
Escolha operações de arquivo por "o que você quer fazer" e "como prevenir acidentes". A tabela abaixo é o ponto de partida.
| O que você quer | Comando | Hábito de segurança |
|---|---|---|
| Copiar | cp |
-i (confirmar sobrescrita) |
| Backup (manter atributos) | cp -a |
-a = recursivo + preservar |
| Mover / renomear | mv |
-i (confirmar sobrescrita) |
| Excluir | rm |
-i (confirmar cada item) |
| Criar / atualizar arquivo | touch |
Mantém o conteúdo existente intacto |
| Criar diretório | mkdir -p |
Criar pais de uma vez |
| Remover diretório vazio | rmdir |
Falha se não estiver vazio (seguro) |
Na dúvida, adote como padrão "adicionar -i em operações destrutivas (rm / sobrescrita com mv)". O fato de rmdir falhar a menos que esteja vazio não é um defeito, mas uma válvula de segurança contra exclusão acidental.
Usando cp / mv / rm
cp - Cópia e Diferenças de Opções
cp duplica arquivos e diretórios. Diretórios requerem -r (recursivo). Para backups, use -a, que também preserva atributos.
cp file1.txt file2.txt cp -r src/ backup/ cp -a src/ archive/
$ ls -l file2.txt -rw-r--r-- 1 user user 0 May 30 10:00 file2.txt
As principais opções significam o seguinte. Isso assume o cp do GNU coreutils.
| Opção | Significado |
|---|---|
-r, -R |
Copiar diretórios recursivamente |
-a |
Modo archive. Equivalente a -dR --preserve=all (manter atributos) |
-i |
Perguntar antes de sobrescrever |
-p |
Preservar atributos como mtime, proprietário e permissões |
-u |
Copiar somente quando o destino e mais antigo ou inexistente |
-r significa "copiar o conteúdo", enquanto -a significa "copiar o conteúdo e preservar completamente atributos, links simbólicos e timestamps". Lembre-se de -r para uma cópia simples e -a para um backup.
-u (update) é útil para sincronização diferencial. cp -au src/ dst/ copia "somente arquivos mais novos preservando atributos", utilizável como um backup simples.
mv - Mover e Renomear
mv serve tanto para mover quanto para renomear. mv antigo novo no mesmo diretório é uma renomeação, e mv arquivo dir/ para outro diretório é uma movimentação. Adicione -i quando sobrescrever for arriscado.
mv draft.txt report.txt mv report.txt /home/user/docs/ mv -i report.txt /home/user/docs/
$ mv -i report.txt /home/user/docs/ mv: overwrite '/home/user/docs/report.txt'? n
| Opção | Significado |
|---|---|
-i |
Perguntar antes de sobrescrever |
-f |
Forçar sobrescrita sem perguntar (cancela o -i) |
Diferente do cp, o mv não precisa de -r para mover um diretório. Dentro do mesmo sistema de arquivos, ele apenas reescreve as informações de caminho sem mover os dados em si, portanto é rápido.
rm - Exclusão e o Perigo do -rf
rm exclui arquivos. Use -r para excluir diretórios e -f para forçar a exclusão sem perguntar. Não existe "lixeira" com rm; exclusão significa remoção imediata.
rm unwanted.txt rm -i unwanted.txt rm -r olddir/
$ rm -i unwanted.txt rm: remove regular file 'unwanted.txt'? y
| Opção | Significado |
|---|---|
-r, -R |
Excluir diretórios recursivamente |
-f |
Suprimir verificações de existência e prompts; forçar |
-i |
Confirmar cada item antes de excluir |
rm -rf exclui uma árvore de diretórios inteira de uma vez sem confirmação. Um erro de digitação no argumento (por exemplo, um espaço perdido após / como em rm -rf / tmp/foo) pode destruir o sistema inteiro. Sempre confirme visualmente os caminhos de destino antes de executar, e combine com -i se não tiver certeza.
touch / mkdir / rmdir / file
touch - Criar Arquivos Vazios e Atualizar Timestamps
touch cria um arquivo inexistente como vazio, e para um arquivo existente atualiza os tempos de acesso e modificação para o horário atual (sem alterar o conteúdo).
touch newfile.txt touch existing.txt touch -c missing.txt
$ ls -l --time-style=+%H:%M newfile.txt -rw-r--r-- 1 user user 0 10:05 newfile.txt
| Opção | Significado |
|---|---|
-a |
Atualizar somente o tempo de acesso |
-m |
Atualizar somente o tempo de modificação |
-c |
Não criar o arquivo se ele não existir |
-t |
Definir para o horário especificado ([[CC]YY]MMDDhhmm[.ss]) |
Executar touch em um arquivo existente não apaga dados. Também é usado para manipular o tempo de modificação, como forçar uma reconstrução (verificação de timestamp do make).
mkdir / rmdir - Criar e Excluir Diretórios
mkdir cria um diretório. Para uma hierarquia profunda cujos pais não existem, use -p para criá-los todos de uma vez. rmdir exclui somente um diretório vazio.
mkdir project mkdir -p project/src/lib rmdir project/src/lib
$ rmdir project rmdir: failed to remove 'project': Directory not empty
Sem -p, você não pode criar um diretório sob um pai inexistente e recebe um erro. Que rmdir "falhe a menos que esteja vazio" é um mecanismo de segurança; para excluir conteúdo e tudo, use rm -r (que é correspondentemente mais perigoso).
file - Determinar o Tipo de Arquivo pelo Conteúdo
file determina o tipo de um arquivo examinando seu conteúdo, não sua extensão. Ele pode ver além de uma extensão falsificada e identificar a entidade real.
file report.pdf script.sh archive.gz photo
report.pdf: PDF document, version 1.7 script.sh: Bourne-Again shell script, ASCII text executable archive.gz: gzip compressed data photo: JPEG image data, JFIF standard 1.01
Mesmo photo sem extensão é identificado como JPEG. Verificar o tipo com file antes de abrir com cat e obter saída ilegível é um hábito seguro.
Wildcards e Expansão do Shell
Wildcards (globs) são um mecanismo para especificar padrões de nomes de arquivo em massa. O ponto-chave é que é o shell, não o cp ou rm, que os expande. O shell substitui o padrão por nomes de arquivo reais antes de passá-los ao comando.
| Padrão | Corresponde a | Exemplo |
|---|---|---|
* |
Qualquer string de zero ou mais caracteres | *.txt -> todos os .txt |
? |
Qualquer caractere único | file?.txt -> file1.txt, fileA.txt |
[abc] |
Qualquer um dos caracteres entre colchetes | file[12].txt -> file1.txt, file2.txt |
[a-z] |
Qualquer caractere único no intervalo | [a-c]* -> nomes que começam com a/b/c |
[!abc] |
Qualquer caractere único não entre colchetes | file[!0].txt -> não file0.txt |
Brace expansion { } é diferente dos globs: ela gera strings mecanicamente independentemente de os arquivos existirem.
echo file{A,B,C}.txt
echo {1..3}.log
mkdir -p project/{src,test,docs}fileA.txt fileB.txt fileC.txt 1.log 2.log 3.log
{A,B,C} é uma lista separada por vírgulas e {1..3} é uma sequência numérica. mkdir -p project/{src,test,docs} cria três diretórios de uma vez.
Brace expansion cria strings mesmo se nenhum arquivo existir (generativa). Globs * ? [ ], por outro lado, correspondem a nomes de arquivo existentes (busca). *.txt não corresponde a nada se não houver .txt, e no bash padrão a própria string do padrão é passada ao comando. Tenha isso em mente.
ls *.nonexistent echo *.nonexistent
ls: cannot access '*.nonexistent': No such file or directory *.nonexistent
Quando um glob não corresponde a nada, o bash por padrão passa o padrão como está (echo imprime essa string, e ls diz "no such file"). Você pode mudar isso para "expandir para vazio quando houver zero correspondências" configurando shopt -s nullglob.
Erros Comuns e Correções
Aqui estão os pontos que causam problemas tanto na prática quanto no exame.
- Esquecer
-rpara diretório nocp:cp dir/ dst/gera um erroomitting directory. Sempre use-rou-apara cópias de diretório. - Confundir
-re-a: Use-rpara uma cópia simples, e-apara um backup que preserva proprietário, permissões, links e timestamps. Somente com-r, os atributos mudam. - Sobrescrever silenciosamente com
mv: Por padrão,mvsobrescreve silenciosamente um arquivo existente. Torne-ium hábito para arquivos importantes. - Executar
rm *no diretório root ou importante: É o shell que expande o glob. Usarecho rm *antes para confirmar o que ele expande é seguro. - Confusão com o erro "not empty" do
rmdir: Este é o comportamento seguro por design. Para excluir conteúdo e tudo, userm -r, mas sempre confirme o alvo.
Solução de Problemas
Sintoma: cp diz "omitting directory" e não copia nada
Causa: Tentativa de copiar um diretório sem -r (ou -a)
Verificação:
file src
Correção: Use cp -r src/ dst/ para diretório, ou cp -a src/ dst/ para também manter atributos.
Sintoma: Arquivos desapareceram após executar rm -rf
Causa: rm -rf exclui recursivamente sem confirmação. rm não tem desfazer
Verificação:
echo rm -rf target/
Correção: Use echo antes para inspecionar visualmente a expansão antes de executar. Combine com -i (rm -ri) se não tiver certeza. Arquivos excluídos só podem ser recuperados de um backup.
Sintoma: Um wildcard não corresponde / o padrão é impresso literalmente
Causa: Zero arquivos correspondem. O bash por padrão passa a string do padrão como está
Verificação:
shopt nullglob ls -d *.txt
Correção: Verifique novamente o diretório de destino e a extensão. Para expandir para vazio quando houver zero correspondências, configure shopt -s nullglob.
Lista de Verificação de Conclusão
- [ ] Explicou e usou a diferença entre
cp -recp -a - [ ] Habilitou confirmação de sobrescrita/exclusão com
mv -i/rm -i - [ ] Confirmou a criação de arquivo vazio e atualização de timestamp com
touch - [ ] Confirmou a diferença entre
mkdir -permdir - [ ] Escreveu
*?[ ]e brace expansion{ }de forma distinta - [ ] Entendeu que é o shell que expande os globs
Resumo
| Cenário | Comando | Ponto |
|---|---|---|
| Copiar | cp -r / cp -a |
-a preserva atributos também |
| Mover / renomear | mv -i |
Padrão sobrescreve silenciosamente |
| Excluir | rm -ri |
Sem desfazer; -rf requer cautela máxima |
| Criar / atualizar | touch / mkdir -p |
Mantém conteúdo existente intacto |
| Remover dir vazio | rmdir |
Falha se não estiver vazio (seguro) |
| Determinar tipo | file |
Pelo conteúdo, não pela extensão |
| Especificar em massa | * ? [ ] { } |
O shell faz a expansão |
Gerenciamento básico de arquivos é a área mais frequentemente usada no LPIC-1. Uma vez que você solidifique isso, avance para o mecanismo de links que aponta para entidades de arquivo, e para o FHS e localização de arquivos, para completar o quadro.