Apergunta anteriorum dos meus perguntou como canalizar arquivos baixados através do tar, agora gostaria de saber como canalizar a saída do tar através do mv. Veja, eu tenho este comando no momento:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz
e isso cria um diretório chamado moksha-0.1.0
, mas gostaria de saber como posso renomear esse diretório de saída como moksha
, talvez por meio de um pipe ( |
) no final deste comando. Embora se você souber fazer isso sem pipe, mas ainda na mesma linha de código do wget e tar, ficarei feliz em aceitá-lo também.
Para ser claro, eu sei disso:
wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha
irá criar um diretório de saída moksha
, mas dentro deste diretório de saída haverá o moksha-0.1.0
diretório, em vez disso, quero renomear este moksha-0.1.0
diretório como moksha
, em vez de colocar moksha-0.1.0
em um novo diretório chamado moksha
.
Responder1
Assim?
[root@b se]# wget -cqO - https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz --transform=s/moksha-0.1.0/moksha/
[root@b se]# ls
moksha
[root@b se]# ls moksha
ABOUT-NLS config.guess debian Makefile.am
aclocal.m4 config.guess.dh-orig depcomp Makefile.in
AUTHORS config.h.in doc missing
autogen.sh config.rpath enlightenment.pc.in netwm.txt
autom4te.cache config.sub enlightenment.spec.in NEWS
BACKPORTS config.sub.dh-orig INSTALL po
BUGS configure install-sh README
ChangeLog configure.ac intl src
compile COPYING ltmain.sh xdebug.sh
config data m4 x-ui.sh
Na tar
página do manual:
--transformar=EXPRESSÃO, --xform=EXPRESSÃO Usar sed substituirEXPRESSÃOpara transformar nomes de arquivos.
Provavelmente sed
é necessário para que isso funcione. Embora se você tiver , provavelmente também wget
terá .sed
Responder2
Nota: Minha resposta não é realmente sobre tar
; é uma resposta especificamente a esta parte da sua pergunta:
... isso cria um diretório chamado
moksha-0.1.0
, mas gostaria de saber como posso renomear esse diretório de saída comomoksha
, talvez por meio de um pipe (|
) no final deste comando. Embora se você souber fazer isso sem pipe, mas ainda na mesma linha de código do wget e tar, ficarei feliz em aceitá-lo também.
Um pipe conecta a saída padrão de um comando com a entrada padrão do próximo. Não tem muito a ver com arquivos – certamente não com a movimentação de arquivos criados por um comando anterior em um pipeline.
O que você quer é umlista.
De man bash
:
AND and OR lists are sequences of one of more pipelines separated by
the && and ││ control operators, respectively. AND and OR lists are
executed with left associativity. An AND list has the form
command1 && command2
command2 is executed if, and only if, command1 returns an exit status
of zero.
A maneira mais fácil de fazer uma verificação simples se-então para um comando, ou de tornar um comando condicional ao sucesso de outro, é com &&
. Exemplos:
[ -r somefile ] && cat somefile
# Checks if somefile exists and is readable; cats the file if it is.
sed -f sedscript inputfile > outputfile && mv outputfile inputfile
# One way (not the best) to edit a file in place.
# The point is that the second command only executes if the first command "succeeds" (i.e. returns a zero exit status).
Então, para o seu comando específico, basta fazer:
(The whole command you wrote) && mv moksha-0.1.0 moksha
Responder3
Você não podecanoum arquivo por meio de mv
, por si só - mv
não lê arquivos de origem da entrada padrão. Nesse caso, sua melhor aposta é alterar tar
o diretório de destino (como emA resposta de Dee Eff) ou renomeá-lo após o fato (como emResposta do curinga).
Minha preferência é pelo primeiro, mas usando -C
and --strip-components
em vez de --transform
:
mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
tar -xzC moksha --strip-components=1
( -C
vainão, na verdade, cria seu argumento - pelo menos não nos BSD ou GNU do meu sistema tar
.)
Isto é mais portátil (o BSD tar
não possui --transform
) e não modificará nomes de arquivos que contenham a string moksha-0.1.0
em outro lugar - em vez disso, simplesmente removerá o primeiro componente do caminho de cada arquivo sendo extraído (por exemplo, moksha-0.1.0/ABOUT-NLS
torna-se apenas ABOUT-NLS
). Como tar
mudou para o novo moksha
diretório, tudo do arquivo será extraído lá.
O arquivo que você vinculou na sua pergunta tem apenas um diretório na raiz, mas é importante observar que o uso dessa técnica em um arquivo commúltiplodiretórios em sua raiz despejarão todo o conteúdo desses diretórios no diretório especificado por -C
. Nesses casos, você seria melhor atendidoextraindo e renomeando conforme necessário.