Além do que foi dito antes por grawity e Paul :
História
Nos "velhos tempos", o cpio (com a opção -c
usada) era a ferramenta usada para mover arquivos para outros derivados do UNIX, já que era mais portátil e flexível que o tar . Mas as questões de portabilidade tar podem ser consideradas como resolvidas desde o final dos anos 80.
Infelizmente foi nessa época que diferentes fornecedores mangled o formato -c
de cpio (basta olhar a página de manual para GNU cpio e a opção -H
). Naquela época, o tar tornou-se mais portátil que o cpio ... Demorou quase uma década até que os diferentes fornecedores de UNIX tivessem resolvido isso. Ter o GNU tar e o GNU cpio instalados era uma obrigação para todos os administradores que tinham que lidar com fitas de diferentes fontes naquela época (até hoje presumo).
Interface do usuário
tar pode usar um arquivo de configuração de fita onde o administrador configuraria as unidades de fita conectadas ao sistema. O usuário, então, apenas diria "Bem, eu pegarei a unidade de fita 1" em vez de ter que lembrar o nó de dispositivo exato da fita (o que pode ser muito confuso e também não é padronizado em diferentes plataformas UNIX.
Mas a principal diferença é:
tar é capaz de pesquisar diretórios por conta própria e pega a lista de arquivos ou diretórios dos quais é feito backup dos argumentos da linha de comando.
O
cpio arquiva apenas os arquivos ou diretórios aos quais é contado, mas não procura subdiretórios de forma recursiva por conta própria. Também o cpio obtém a lista de itens a serem arquivados de stdin - é por isso que quase sempre é usado em combinação com find .
Um comando cpio geralmente parece assustador para o iniciante se comparado com tar :
$ find myfiles -depth -print0 | cpio -ovc0 | gzip -7 > myfiles.cpio.gz
$ tar czvf myfiles.tar.gz myfiles
Acho que essa é a principal razão pela qual a maioria das pessoas usa o tar para criar arquivos mortos: para tarefas simples, como agrupar um diretório completo, é mais fácil de usar.
Além disso, o GNU tar oferece a opção -z
, que faz com que o arquivo seja compactado com GNU zip , tornando as coisas ainda mais fáceis.
Por outro lado, pode-se fazer coisas interessantes com encontrar & cpio . Na verdade, é uma abordagem mais parecida com o UNIX: Por que incluir a pesquisa de árvore de diretórios no cpio se já existe uma ferramenta que cuida de quase tudo que se pode pensar: localizar . As coisas que vêm à mente são apenas fazer backup de arquivos mais novos que uma determinada data, restringindo os arquivos àqueles que residem no mesmo sistema de arquivos ou filtrando a saída de localização com grep -v
para excluir determinados arquivos ...
As pessoas do GNU tar gastaram muito trabalho para incluir muitas dessas coisas que anteriormente só eram possíveis com o cpio . Na verdade, ambas as ferramentas aprenderam umas com as outras - mas somente o cpio pode ler o formato tar - e não o contrário.
tar e processamento de saída
Uma última nota para algo que você disse:
Also I was told TAR cannot compress from STDOUT. I want to archive /
compress ZFS snapshots for backups. I was wondering if I could combine
CPIO with bzip2 to get this effect.
Bem, todas as versões do tar (GNU ou não) podem ser usadas em um pipe. Basta usar um sinal de menos ( -
) como nome do arquivo:
$ tar cvf - myfiles | bzip > myfiles.tar.bz
Também o GNU tar oferece a opção --to-command
para especificar um comando de pós-processamento - embora eu ainda prefira o pipe. Talvez seja útil ao gravar em determinados dispositivos de hardware.