(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 ).