Quero gzipar todos os arquivos *.vtu
, em todas as profundidades abaixo de um determinado diretório, no bash. Eu tenho esses arquivos nas profundidades 1 e 2 abaixo ./
. Eu consegui fazer isso com
$ gzip -v $(find . -name "*.vtu")
Eu também poderia usar find ... -exec
, e outras combinações (veja abaixo).
Existe alguma maneira de fazer isso apenas com o recurso gzip ( -r
era meu candidato)?
eu esperava
$ gzip -r -v "*.vtu"
onde o padrão não seria expandido pelo shell, mas expandido por gzip
(e de forma a produzir o resultado pretendido !), funcionaria para isso, mas consegui gzip: ...: No such file or directory
com todas as combinações que tentei. O que encontrei é o seguinte:
- Com
shopt -s globstar
(a partir daqui ), o comandogzip -v **/*.vtu
parece fazer exatamente o que eu quero. - Se
shopt | grep globstar
derglobstar off
, o comando acima não funciona. Nesse caso, posso usargzip -v */*.vtu
, mas só funciona com arquivos em profundidade=1. Da mesma forma comgzip -v */*/*.vtu
profundidade = 2.
De qualquer forma, não encontrei qual é o efeito/utilidade de flag -r
.
Relacionado :
Não, o gzip não pode fazer isso,
-r
significa apenas "descer aos subdiretórios", mas não há opção para "descer aos subdiretórios e procurar arquivos que correspondam a este globo". A expansão do*.vtu
glob acontece antesgrep
de ser iniciada e é tratada pelo shell notgrep
, portantogrep
é fornecida uma lista específica de arquivos: aqueles arquivos correspondentes*.vtu
no diretório atual.Então sim,
globstar
é sua melhor aposta. Quanto ao uso de-r
, isso é explicado emman gzip
:Então
gzip -r foo
significa "descer atéfoo
iffoo
é um diretório e compactar todos os arquivos nele". Sefoo
corresponder a arquivos e diretórios, se, por exemplo, você tivesse ambosfile.vtu
emy.vtu/
no diretório em que executougzip
, o conteúdomy.vtu
também seria compactado. Sem isso, você conseguiriamy.vtu is a directory -- ignored
.Outras opções incluem:
find . -name "*.vtu" -exec gzip {} +
para compactar todos os arquivos correspondentes.gzip **/*.vtu
comglobstar
conjunto.find . -name "*.vtu" | xargs gzip
(desde que seus nomes sejam sensatos e não contenham novas linhas)find . -name "*.vtu" -print0 | xargs -0 gzip
(se os nomes dos seus arquivos puderem conter novas linhas)Após a resposta de terdon e depois de mexer um pouco, cheguei à conclusão de que a forma como
-r
funciona é a seguinte:gzip
.gzip -r *
.Para mim, isso é extremamente estranho (e portanto eu nunca teria imaginado que era assim que funcionava). Por exemplo, se
./
eu tiverO comando
gzip -r -v *.vtk
gziparia todos os arquivos, exceto./foo
. Todos os arquivos (não apenas*.vtk
), em todos os subdiretórios*.vtk
(com profundidade=1) e*
(com profundidade>1) seriamgzip
ped.Não é uma resposta exata para sua pergunta, mas você pode usar
xargs
para isso, o que permite executar váriosgzip
processos em paralelo, como*.vtk
, citado para que não seja expandido pelo shellxargs
-r
) porque o gzip usaria stdin-0
)gzip
invocação (-n1
)-P
) quanto a saída donproc
comando diz que temos CPUsgzip
comando para cada entrada