Como criar tar.gz de cada arquivo de um tipo particular em um único comando?

2

Eu preciso compactar e descompactar cada um dos arquivos de um tipo específico, digamos *.html em sua respectiva localização. Para descompressão, usei o comando a seguir, pareceu funcionar para mim:

find dir -name "*.html.tar.gz" -exec tar -xvzf {} \;

Consigo ver *.htmp.tar.gz em seus respectivos diretórios.

Para compactação, estou tentando seguir o comando, mas ele não está funcionando, pois a concatenação não está acontecendo com o argumento do find:

find dir -name "*.html" -exec tar -cvzf {}.tar.gz {} \;

Por favor, sugira solução para isso e deixe-me saber se a solução para a descompressão não é infalível.

EDIT: Embora eu tenha usado agora gunzip , que não exigem nome de destino, mas eu estou querendo saber se tar não é possível a todos. Então, aguardando resposta que resolve o problema original.

EDIT: o requisito é ter um único comando porque eu preciso executá-lo através do comando fork() e exec() da função C. Então, acho que a tubulação não é possível.

EDIT: Também estou procurando uma maneira eficiente, porque eu quero o mínimo de sobrecarga possível para o tempo necessário para a compactação.

    
por Vivek Agrawal 09.03.2017 / 07:33

2 respostas

1

find . -name '*.html' -type f -exec sh -c '
   for file do tar czf "$file.tar.gz" "$file"; done' sh {} +

Em C:

execlp("find", "find", ".", "-name", "*.html", "-type", "f", "-exec",
       "sh", "-c", "for file do tar czf \"$file.tar.gz\" \"$file\"; done",
       "sh", "{}", "+", 0);
    
por 10.03.2017 / 14:18
0

Você precisa usar xargs para conseguir isso:

find "dir" -name "*.html" -print0 | xargs -0 -n1 -I % tar zcpf %.tar.gz %

Ele lida com quase todos os caracteres especiais em nomes de arquivos.

    
por 09.03.2017 / 10:55

Tags