Como canalizar a saída do tar por mv?

3

Um pergunta anterior

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 eu gostaria de saber como eu poderia renomear este diretório de saída como moksha , talvez por meio de um pipe ( | ) no final deste comando. Embora, se você souber como fazer isso sem um pipe, mas ainda na mesma linha de código que o wget e o tar, ficarei feliz em aceitá-lo também.

Para ficar claro, eu sei que:

wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz | tar -xz -C moksha

criará um diretório de saída moksha , mas nesse diretório de saída haverá o diretório moksha-0.1.0 , em vez de renomear este diretório moksha-0.1.0 como moksha , em vez de colocar moksha-0.1.0 em um novo diretório chamado moksha .

    
por Brenton Horne 04.11.2015 / 05:32

3 respostas

8

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 página de manual tar :

--transform=EXPRESSION, --xform=EXPRESSION
    Use sed replace EXPRESSION to transform file names.

Portanto, sed é provavelmente necessário para que isso funcione. No entanto, se você tiver wget , provavelmente terá sed também.

    
por 04.11.2015 / 05:58
5

Observação: minha resposta não é realmente sobre tar ; é uma resposta a essa parte da sua pergunta especificamente:

...this creates a directory called moksha-0.1.0, but I would like to know how I might rename this output directory as moksha, perhaps via a pipe (|) at the end of this command. Although if you know how to do this without a pipe, but still on the same line of code as wget and tar, I will be happy to accept it too.

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 é uma lista .

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 simples verificação if-then de um comando ou 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, faça:

(The whole command you wrote) && mv moksha-0.1.0 moksha
    
por 04.11.2015 / 06:42
4

Você não pode enviar um arquivo por meio de mv , por exemplo - mv não lê arquivos de origem da entrada padrão. Nesse caso, sua melhor aposta é obter tar para alterar o diretório de destino (como em resposta de Dee Eff ) ou renomeá-lo após o fato (como em resposta de Wildcard ).

A minha preferência é para o primeiro, mas usando -C e --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 não , na verdade, cria seu argumento - pelo menos não no BSD do meu sistema ou no GNU tar s.)

Isso é mais portável (o% BSDtar não tem --transform ) e não modifica nomes de arquivos que contenham a string moksha-0.1.0 em outro lugar - em vez disso, ele simplesmente removerá o primeiro componente do caminho de cada arquivo extraído (por exemplo, moksha-0.1.0/ABOUT-NLS se torna apenas ABOUT-NLS ). Como tar foi alterado para o novo diretório moksha , tudo a partir do arquivo será extraído lá.

O arquivo que você vinculou em sua pergunta tem apenas um diretório em sua raiz, mas é importante notar que o uso dessa técnica em um arquivo com diretórios múltiplos em sua raiz fará o dump de todo o conteúdo esses diretórios no diretório especificado por -C . Nesses casos, seria melhor você extrair e renomear conforme necessário .

    
por 04.11.2015 / 12:55