A sua versão de tar
não suporta o parâmetro -z
?
$ tar ztvf file.tar.gz | grep fliename
Isso retornaria o nome do arquivo se ele existisse no arquivo.
Extraindo o arquivo
Você poderia fazer algo assim se quisesse procurar o arquivo primeiro e apenas se presente, depois extraí-lo.
$ arc="<tarball>"; file="<file to extract>"; \
tar ztvf $arc | grep $file && tar zxvf $arc $file
Sample Tarball
$ tar ztvf ffmpeg.static.64bit.2013-10-05.tar.gz
-rwxr-xr-x root/root 19579304 2013-10-05 00:06 ffmpeg
-rwxr-xr-x root/root 19528712 2013-10-05 00:06 ffprobe
Exemplo
$ arc="ffmpeg.static.64bit.2013-10-05.tar.gz"; file="ffmpeg"; \
tar ztvf $arc | grep $file && tar zxvf $arc $file
-rwxr-xr-x root/root 19579304 2013-10-05 00:06 ffmpeg
ffmpeg
Confirmação
$ ll ffmpeg
-rwxr-xr-x 1 manny manny 19579304 Oct 5 00:06 ffmpeg*
Um diretório diferente
Se você quiser enviar o arquivo extraído para outro local, use a opção tar
-C
.
$ arc="<tarball>"; file="<file to extract>"; \
tar ztvf $arc | grep $file && tar zxvf $arc -C /path/to/dir $file
Exemplo # 1
$ arc="ffmpeg.static.64bit.2013-10-05.tar.gz"; \
file="ffmpeg"; tar ztvf $arc | grep $file && tar zxvf $arc -C /tmp $file
Confirmação
$ ll /tmp/ffmpeg
-rwxr-xr-x 1 manny manny 19579304 Oct 5 00:06 /tmp/ffmpeg*
Exemplo # 2
$ arc=cp210x.tar.gz; file="cp210x/usb-serial/Makefile"; \
tar ztvf $arc | grep $file && tar zxvf $arc -C /tmp $file
Confirmação
$ ll /tmp/cp210x/usb-serial/Makefile
-rw-rw-r-- 1 manny manny 388 May 13 01:37 /tmp/cp210x/usb-serial/Makefile
Exemplo # 3
Caracteres curinga também podem ser usados se você quiser extrair um padrão de arquivos.
$ arc=cp210x.tar.gz; file='*Makefile'; \
tar ztvf $arc | grep -E "$file" && tar zxvf $arc -C /tmp --wildcards "$file"
Confirmação
$ find /tmp/cp210x -ls | grep Makefile
26881948 4 -r--r--r-- 1 manny manny 171 Mar 14 2012 /tmp/cp210x/Linux_3.x.x_VCP_Driver_Source/Makefile
26881960 4 -rw-rw-r-- 1 manny manny 388 May 13 01:37 /tmp/cp210x/usb-serial/Makefile
Detalhes
O acima envolve algumas alterações adicionais. Estamos extraindo tudo o que corresponde a '*Makefile'
. Observe que nós o incluímos em aspas simples versus aspas duplas agora. Isso é para proteger o *Makefile
de ser expandido acidentalmente.
grep
agora inclui a opção -E
, porque estamos procurando uma expressão regular agora e não apenas uma única string na saída de tar
. Além disso, o argumento para grep
também não está entre aspas duplas.
Agora usamos o switch --wildcards
para o segundo tar
, para que possamos extrair com base em um padrão, em vez de apenas um único arquivo. Este argumento também está agora entre aspas duplas para protegê-lo.