Como usar globs / wildcards quando a opção -C é usada no comando tar?

2

Minha estrutura de diretórios é a seguinte:

/home/workspace/build/
/home/workspace/js/jai.1.js
/home/workspace/js/jai.2.js
/home/workspace/js/jai.3.js
/home/workspace/js/jai.4.js

Eu quero tar todos os arquivos js cujo prefixo é jai que estão no diretório /home/workspace/js/ to /home/workspace/build/ directory.

Suponha que o nome do arquivo tar criado seja bundle.tar.gz

Então bundle.tar.gz deve conter os seguintes arquivos

jai.1.js
jai.2.js
jai.3.js
jai.4.js

Eu quero conseguir isso usando o comando tar em vez de copiar arquivos para o destino e, em seguida, aplicá-lo.

EDITAR

Eu quero colocar no diretório destination , ou seja, /home/workspace/build/

    
por Prashant Pokhriyal 28.09.2017 / 10:03

2 respostas

5
(cd ../js && pax -w jai.*.js) | gzip > bundle.tar.gz

Faria isso (ou substitua pax -w por tar cf - se você tiver um comando tar ). O objetivo é alterar o diretório atual apenas para pax / tar usando uma subcamada.

Algum tar implementations ( tar é um comando não-portável, é por isso que o POSIX introduziu pax ) tem uma opção -C que faz com que ele mude o diretório para a coleção, mas não para a saída do arquivo. Geralmente, eles também suportam uma opção z para chamar gzip por si mesmos ou implementar a compactação gzip internamente.

No entanto, coisas como:

tar czf bundle.tar.gz -C ../js jai.*.js

não funcionaria porque jai.*.js é expandido pelo shell para o qual o diretório atual não foi alterado. Com zsh , você poderia fazer:

tar czf bundle.tar.gz -C ../js ../js/jai.*.js(:t)

Onde o modificador :t obtém o tail (basename) dos arquivos gerados pelo glob.

Com pax , você também pode fazer:

pax -'s|.*/||' -w -- ../js/jai.*.js | gzip > bundle.tar.gz

Mas observe que a substituição para remover os componentes do caminho principal também se aplica ao destino dos links simbólicos (algumas implementações de tar têm opções semelhantes onde você pode especificar se deseja ou não aquelas traduzidas) e também forneceriam resultado se algum desses arquivos jail.*.js fosse do tipo diretório e contivesse mais arquivos.

Com o libarchive bsdtar , você também pode fazer:

bsdtar zcf bundle.tar.gz -C ../js --include=. --include='jai.*.js' .

O% GNUtar não tem --include por --exclude , então você pode fazer:

tar zcf bundle.tar.gz -C ../js --exclude='*[^s.]' \
                               --exclude='*?.' \
                               --exclude='*[^j]s' \
                               --exclude='*[^.]js' .

(isso adicionaria uma entrada para . )

com star :

star czf bundle.tar.gz -C ../js 'pat=jai.*.js' .

(incluiria jai.foo/bar.js , e não arquivos não correspondentes em jail.*.js diretórios)

star czf bundle.tar.gz -C ../js 'pat=jai.#[^/].js{%!/*}' .

(onde #<expr> é como <expr>* em EREs e {%!/*} como (/.*)? ( % é nada e ! é OR)) para fazer o mesmo que (cd ../js && tar czf - jai.*.js) > bundle.tar.gz . Ele também ainda rastrearia toda a estrutura de diretórios para selecionar apenas os arquivos no nível superior.

Com versões mais recentes, você também pode usar -find . Então, para o equivalente do nosso (cd ...) one que não rastreia em diretórios desnecessários, mas ainda inclui todos os arquivos em jai.*.js diretórios:

star czf bundle.tar.gz C=../js  -find . \
  \( \( -name '*.js' -o -path '*/*' -o -name . \) -o ! -prune \) ! -name .

Embora seja mais provável, você realmente deseja:

star czf bundle.tar.gz C=../js \
  -find . -maxdepth 1 -name 'jai.*.js' -type f

Isso é somente arquivar os arquivos jai.*.js regulares e somente no nível superior, que com zsh você também poderia fazer com:

(cd ../js && pax -w -- jai.*.js(.)) | gzip > bundle.tar.gz

( (.) sendo um qualificador glob que restringe a arquivos regulares ).

    
por 28.09.2017 / 10:41
3

Nenhuma regex é necessária aqui. Você pode usar apenas um asterisco simples como esse:

tar cvzf /home/workspace/build/bundle.tar.gz /home/workspace/js/jai.*.js

Se você não quiser manter a estrutura de diretórios, a maneira mais fácil é cd /home/workspace/js/ e, em seguida, tar cvzf /home/workspace/build/bundle.tar.gz jai.*.js

    
por 28.09.2017 / 10:05