Parece que tenho um problema. Tenho alguns tipos de arquivos diferentes em meu diretório atual e quero apenasalcatrãoo.pngarquivos. Eu comecei com isso:
find -name "*.png" | tar -cvf backupp.tar
Não funcionaria porque não especifiquei quais arquivos, então, observando como os outros fizeram isso, adicionei xargs:
find -name "*.png" | xargs tar -cvf backupp.tar
Desta vez funcionou e o arquivo backupp.tar foi criado, mas aqui está o problema. Não consigo extraí-lo. Sempre que digito:
tar -xvf backupp.tar
Nada acontece. Tentei alterar o chmod e o sudo, mas nada cede.
Então, digitei o comando errado completamente ou há algo que perdi?
Responder1
Cada uma de suas duas abordagens estava perto de funcionar, mas cada uma tinha um problema distinto.
Na sua primeira abordagem, você tenta canalizar uma lista de arquivos para tar
. Se você quiser tar
ler a lista de arquivos da entrada padrão, você deve usar as opções -T
/ --files-from
e , por exemplo-
find -name '*.png' -print0 | tar -cvf backup.tar --null -T -
Para referência, consulte a documentação oficial:
OBSERVAÇÃO:O uso dos -print0
sinalizadores --null
e deve garantir que isso também lide com nomes de arquivos que incluem espaços em branco.
Na sua segunda abordagem, você tenta executar tar
via xargs
, mas está usando a opção "criar" ( --create
/ -c
). Se você usar a opção "criar" com xargs
ou em um loop for, ela substituirá o arquivo após cada iteração. Em vez disso, tente usar a opção "anexar" ( -a
/ --append
) ou a opção "atualizar" ( -u
/ --update
), por exemplo:
find -name "*.png" -exec tar -uvf backupp.tar {} \;
Isso anexará arquivos ao arquivo após cada iteração, em vez de sobrescrevê-lo.
De qualquer forma, quando terminar você pode usar a opção "lista" ( --list
/ -t
) para visualizar o conteúdo do arquivo e verificar se tudo funcionou conforme o esperado:
tar tf backupp.tar
Responder2
Você pode simplesmente usar o curinga
tar -cvf backup.tar *.png
ou usandofind
find -name "*.png" | tar -cvf backup.tar -T -
a -T
opção obtém o nome do arquivo de FILE que neste caso é stdin-