Como canalizo a saída do tar através do mv?

Como canalizo a saída do tar através do mv?

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.0diretório, em vez disso, quero renomear este moksha-0.1.0diretório como moksha, em vez de colocar moksha-0.1.0em 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 tarpá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 wgetterá .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 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.

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ó - mvnão lê arquivos de origem da entrada padrão. Nesse caso, sua melhor aposta é alterar taro 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 -Cand --strip-componentsem vez de --transform:

mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
  tar -xzC moksha --strip-components=1

( -Cvainão, na verdade, cria seu argumento - pelo menos não nos BSD ou GNU do meu sistema tar.)

Isto é mais portátil (o BSD tarnão possui --transform) e não modificará nomes de arquivos que contenham a string moksha-0.1.0em 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-NLStorna-se apenas ABOUT-NLS). Como tarmudou para o novo mokshadiretó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.

informação relacionada