Como usuários de Linux, interagimos com arquivos e diretórios de tempos em tempos. Uma operação comum que os usuários realizam é copiar arquivos e diretórios. Certamente, podemos usar um gerenciador de arquivos gráfico para realizar a operação de cópia. No entanto, a maioria dos usuários de Linux prefere usar o comando cp devido à sua simplicidade e rica funcionalidade.
- 1. Como copiar um arquivo no Linux
- 2. Mostrar progresso do comando cp
- 3. Como copiar vários arquivos para o diretório
- 4. Como evitar sobrescrever o arquivo
- 5. Como sobrescrever o arquivo com confirmação
- 6. Sobrescrever o arquivo somente se a fonte for mais recente
- 7. Como fazer backup de arquivos antes de sobrescrevê-los
- 8. Como forçar a cópia para sobrescrever o arquivo
- 9. Como remover o arquivo de destino antes de copiar
- 10. Como criar um arquivo de link físico em vez de copiar
- 11. Como criar um arquivo de link simbólico em vez de copiar
- 12. Como preservar os atributos do arquivo durante a cópia
- 13. Como executar a operação de cópia recursivamente
- 14. Como copiar vários diretórios
Neste guia para iniciantes, aprenderemos sobre o comando cp. Como o nome sugere, o comando cp é usado para copiar arquivos e diretórios em um determinado caminho.
Ao longo deste guia, entenderemos o uso do comando cp usando exemplos práticos que podem ser usados no dia a dia.
Então vamos começar.
A sintaxe do comando cp é idêntica à de outros comandos do Linux. Em um nível mais amplo, ele é dividido em duas partes – opções e argumentos :
$ cp [OPÇÕES] <ORIGEM> <DESTINO>
$ cp [OPÇÕES] <FONTE-1> <FONTE-2> ... <DIRETÓRIO>
Na sintaxe acima, os colchetes ([])representam os argumentos opcionais, enquanto os colchetes angulares (<>)representam os argumentos obrigatórios.
1. Como copiar um arquivo no Linux
Um dos usos básicos do comando cp é copiar um arquivo para o diretório atual. Na maioria das vezes, os usuários realizam essa operação para fazer um backup de configurações importantes.
Por exemplo, geralmente criamos uma cópia de backup do arquivo /etc/ssh/sshd_config antes de atualizar a configuração SSH.
Para entender o uso, vamos criar um arquivo simples:
$ touch file-1.txt
Em seguida, crie uma cópia do arquivo usando o seguinte comando:
$ cp file-1.txt file-2.txt
2. Mostrar progresso do comando cp
No exemplo anterior, usamos o comando ls para verificar se a operação de cópia do arquivo foi bem-sucedida. No entanto, não faz sentido usar mais um comando apenas para verificar o resultado dos comandos anteriores.
Nesses casos, podemos habilitar o modo verbose usando a -vopção , que fornece diagnósticos para cada arquivo processado.
Vamos fazer uma cópia do arquivo file-1.txt usando o seguinte comando:
$ cp -v file-1.txt file-3.txt
Na saída acima, a seta representa o arquivo que está sendo copiado. O argumento à esquerda é o arquivo de origem, enquanto o argumento à direita é o arquivo de destino.
3. Como copiar vários arquivos para o diretório
Até agora, trabalhamos apenas com um único arquivo e o diretório de trabalho atual. No entanto, no ambiente de produção real, precisamos trabalhar com um grande número de arquivos. Um dos casos de uso comuns nesses ambientes é copiar vários arquivos para um único diretório.
Obviamente, podemos executar o comando cp várias vezes para conseguir isso, mas essa não será a maneira mais eficaz. Para realizar tal operação com eficiência, podemos usar uma sintaxe alternativa do comando cp.
Então, primeiro, crie um novo diretório com o nome dir-1:
$ mkdir dir-1
Agora, vamos copiar todos os três arquivos para o diretório dir-1 usando o comando único:
$ cp -v arquivo-1.txt arquivo-2.txt arquivo-3.txt dir-1
A saída acima mostra que todos os arquivos foram copiados para o diretório dir-1 . Além disso, é importante observar que, para usar essa sintaxe alternativa, o diretório já deve estar presente e deve ser o último argumento do comando.
4. Como evitar sobrescrever o arquivo
Por padrão, o comando cp substitui o arquivo de destino, o que significa que ele sobrescreverá o arquivo se ele existir no destino com o mesmo nome. No entanto, podemos desativar esse comportamento padrão usando a opção -n.
Para entender isso, vamos tentar sobrescrever o arquivo existente:
$ cp -n -v file-1.txt file-2.txt
Neste exemplo, usamos a opção -v para ilustrar que o arquivo file-2.txt não foi sobrescrito.
5. Como sobrescrever o arquivo com confirmação
No exemplo anterior, vimos como evitar a sobrescrita do arquivo de destino. No entanto, às vezes, queremos sobrescrever o arquivo de destino de forma mais segura.
Nesses casos, podemos usar a opção -i do comando para tornar a operação de cópia interativa. Esta opção exibe a mensagem de aviso e aguarda a confirmação do usuário antes de sobrescrever o arquivo.
Para ilustrar isso, vamos tentar sobrescrever o arquivo existente:
$ cp -i file-1.txt file-2.txt
cp: sobrescrever 'file-2.txt'?
Como podemos ver, o comando está aguardando confirmação. Assim como outros comandos do Linux, podemos usá-lo 'y'para continuar ou 'n'abortar a operação.
Este comportamento não interativo padrão do comando cp não é muito seguro. Há chances de o usuário sobrescrever uma configuração importante por engano. Portanto, algumas distribuições Linux impõem o comportamento interativo por padrão usando o comando alias:
$ alias cp='cp -i'
6. Sobrescrever o arquivo somente se a fonte for mais recente
No exemplo anterior, vimos como usar o modo interativo. No entanto, às vezes, um usuário pode sobrescrever o arquivo mais recente inadvertidamente.
Para evitar esses casos propensos a erros, podemos usar a opção -u que tenta a operação de cópia somente se a origem for mais recente que o destino ou se o arquivo não estiver presente no destino.
Primeiro, atualize o registro de data e hora do arquivo de origem:
$ touch -t 10101010 file-1.txt
$ ls -l file-1.txt
No exemplo acima, usamos a opção -t do comando touch para definir o registro de data e hora do arquivo para 10-out-2010.
Em seguida, vamos atualizar o registro de data e hora do arquivo de destino para a hora atual:
$ touch file-2.txt
Agora, vamos tentar realizar a operação de cópia usando a opção -u:
$ cp -u -v file-1.txt file-2.txt
Aqui, podemos ver que a operação de cópia não foi tentada porque o arquivo de destino é mais recente que o de origem.
Por fim, vamos trocar os argumentos de origem e destino e executar a operação de cópia:
$ cp -u -v file-2.txt file-1.txt
Na saída acima, podemos observar que a operação de cópia foi bem-sucedida porque o arquivo de origem é mais recente que o de destino.
7. Como fazer backup de arquivos antes de sobrescrevê-los
Podemos instruir o comando cp a fazer um backup do arquivo de destino antes de sobrescrevê-lo. Para isso, podemos usar a opção --backup que realiza backups automatizados.
$ cp --backup=numbered -v file-1.txt file-2.txt
Neste exemplo, usamos a política de backup numerado. Essa política usa números incrementais nos nomes dos arquivos de backup.
Para entender isso, vamos executar o mesmo comando várias vezes e observar a saída:
$ cp --backup=numbered -v file-1.txt file-2.txt
$ cp --backup=numbered -v file-1.txt file-2.txt
$ cp --backup=numbered -v file-1.txt file-2.txt
8. Como forçar a cópia para sobrescrever o arquivo
Nos exemplos anteriores, vimos como sobrescrever o arquivo de forma mais segura. No entanto, em alguns casos raros, o requisito é sobrescrever o arquivo. Contudo, não há garantia de que a operação será bem-sucedida todas as vezes.
Por exemplo, a operação de cópia falhará se o arquivo de destino não tiver permissões de gravação. Vamos ilustrar isso com um exemplo.
Primeiro, altere as permissões do arquivo de destino:
$ chmod 444 file-2.txt
$ ls -l file-2.txt
Agora, vamos tentar sobrescrever o arquivo file-2.txt :
$ cp arquivo-1.txt arquivo-2.txt
Na saída acima, podemos ver que o comando falhou com o erro de permissão negada.
Para superar essa limitação, podemos usar a -fopção que exclui os arquivos de destino e tenta a operação de cópia se o arquivo de destino não puder ser aberto.
Agora, vamos usar a -fopção para sobrescrever o arquivo à força:
$ cp -f -v arquivo-1.txt arquivo-2.txt
9. Como remover o arquivo de destino antes de copiar
No exemplo anterior, vimos como remover o arquivo de destino caso ocorra um erro durante a operação. No entanto, às vezes, o requisito é remover o arquivo de destino primeiro e depois executar a operação de cópia.
Para atender a esse requisito, podemos usar a opção --remove-destination.
$ cp --remove-destination -v file-1.txt file-2.txt
Na saída acima, podemos ver que o comando cp primeiro remove o arquivo de destino e depois executa a operação de cópia.
10. Como criar um arquivo de link físico em vez de copiar
Podemos criar um link físico em vez de criar uma nova cópia do arquivo de origem. Essa opção desempenha um papel importante quando há escassez de espaço em disco.
Então, vamos usar a -lopção de criar um link físico:
$ cp -l -v arquivo-1.txt arquivo-4.txt
Agora, vamos verificar os números de inode de ambos os arquivos para verificar os links físicos:
$ ls -i1 arquivo-1.txt arquivo-4.txt
Na saída acima, os números na primeira coluna representam os números de inode.
11. Como criar um arquivo de link simbólico em vez de copiar
De forma semelhante, podemos criar um link simbólico em vez de criar uma nova cópia usando a opção -s mostrada abaixo:
$ cp -s -v arquivo-1.txt arquivo-5.txt
Agora, vamos verificar se o link simbólico foi criado corretamente:
$ ls -l file-5.txt
Na saída acima, as últimas colunas representam a relação de link simbólico.
12. Como preservar os atributos do arquivo durante a cópia
Existem vários atributos associados ao arquivo, como tempo de acesso, tempo de modificação, permissões, etc. Por padrão, esses atributos não são preservados durante a cópia do arquivo. Para substituir esse comportamento padrão, podemos usar a opção -p.
Para entender isso, primeiro atualize o registro de data e hora do arquivo-1.txt :
$ touch -t 10101010 file-1.txt
Agora, vamos criar uma cópia deste arquivo preservando todos os seus atributos:
$ cp -p -v file-1.txt file-6.txt
Por fim, verifique o timestamp do arquivo file-6.txt :
$ ls -l file-6.txt
13. Como executar a operação de cópia recursivamente
Até agora, vimos como copiar um único arquivo. No entanto, muitas vezes precisamos copiar todos os arquivos e subdiretórios de um diretório específico.
Nesses casos, podemos usar o modo recursivo usando a opção -rou .-R
Então, vamos criar um diretório e adicionar alguns arquivos e subdiretórios abaixo dele:
$ mkdir -p dir-1/dir-2
$ touch dir-1/arquivo-1.txt dir-1/dir-2/arquivo-2.txt
Em seguida, verifique se a estrutura do diretório foi criada corretamente:
$ árvore dir-1
Agora, vamos copiar o diretório dir-1 recursivamente usando o seguinte comando:
$ cp -r -v diretório-1 diretório-3
Por fim, verifique se todos os arquivos e subdiretórios foram copiados com sucesso:
$ tree dir-3
14. Como copiar vários diretórios
Semelhante aos arquivos, podemos copiar vários diretórios recursivamente usando um único comando. No entanto, para isso, o diretório de destino deve estar presente e deve ser o último argumento do comando. Vamos entender isso com um exemplo.
Primeiro, crie um diretório, um novo diretório:
$ mkdir dir-4
Agora, vamos copiar os diretórios dir-1 e dir-3 para o diretório dir-4 usando o comando abaixo:
$ cp -r -v dir-1 dir-3 dir-4
De forma semelhante, podemos usar a opção -t do comando para obter o mesmo resultado. Esta opção nos permite especificar o diretório de destino. Portanto, podemos usá-la também como primeiro argumento:
$ cp -t dir-4 -r -v dir-1 dir-3
Neste artigo, discutimos como copiar arquivos e diretórios usando o comando cp. Iniciantes podem consultar esses exemplos no dia a dia ao trabalhar com sistemas Linux.
Você conhece algum outro exemplo melhor do comando cp no Linux? Deixe sua opinião nos comentários abaixo.

