¿Cómo canalizo la salida de tar a través de mv?

¿Cómo canalizo la salida de tar a través de mv?

APregunta anteriorUno de los míos preguntó cómo canalizar los archivos descargados a través de tar, ahora me gustaría saber cómo canalizar la salida de tar a través de mv. Mira, tengo este comando en este momento:

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

y esto crea un directorio llamado moksha-0.1.0, pero me gustaría saber cómo puedo cambiar el nombre de este directorio de salida moksha, tal vez a través de una tubería ( |) al final de este comando. Aunque si sabes cómo hacer esto sin una tubería, pero aún en la misma línea de código que wget y tar, estaré feliz de aceptarlo también.

Para ser claro, sé que:

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

creará un directorio de salida moksha, pero dentro de este directorio de salida estará el moksha-0.1.0directorio; en lugar de eso, quiero cambiar el nombre de este moksha-0.1.0directorio como moksha, en lugar de colocarlo moksha-0.1.0en un nuevo directorio llamado moksha.

Respuesta1

¿Como esto?

[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

Desde la tarpágina del manual:

--transformar=EXPRESIÓN, --xforma=EXPRESIÓN
    Usar reemplazo de sedEXPRESIÓNpara transformar nombres de archivos.

Probablemente sedsea necesario para que esto funcione. Aunque si es así wget, probablemente sedtambién lo sea.

Respuesta2

Nota: Mi respuesta no se trata realmente de tar; es una respuesta a esta parte de su pregunta específicamente:

... esto crea un directorio llamado moksha-0.1.0, pero me gustaría saber cómo puedo cambiar el nombre de este directorio de salida como moksha, tal vez a través de una tubería ( |) al final de este comando. Aunque si sabes cómo hacer esto sin una tubería, pero aún en la misma línea de código que wget y tar, estaré feliz de aceptarlo también.

Una tubería conecta la salida estándar de un comando con la entrada estándar del siguiente. No tiene mucho que ver con los archivos, ciertamente no con los archivos en movimiento creados por un comando anterior en una canalización.

Lo que quieres es unlista.

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.

La forma más sencilla de realizar una comprobación simple de si-entonces para un comando, o de condicionar un comando al éxito de otro, es con &&. Ejemplos:

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

Entonces, para tu comando específico, simplemente haz:

(The whole command you wrote) && mv moksha-0.1.0 moksha

Respuesta3

no puedestuboun archivo a través de mv, per se: mvno lee archivos fuente desde la entrada estándar. En este caso, lo mejor que puede hacer es tarcambiar el directorio de destino (como enLa respuesta de Dee Eff) o cambiarle el nombre después del hecho (como enLa respuesta del comodín).

Mi preferencia es por lo primero, pero usando -Cy --strip-componentsen lugar de --transform:

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

( -Cvoluntadno, de hecho, crea su argumento, al menos no en los BSD o GNU de mi sistema tar).

Esto es más portátil (el BSD tarno tiene --transform) y no modificará los nombres de archivos que contengan la cadena moksha-0.1.0en ningún otro lugar; en cambio, simplemente eliminará el primer componente de la ruta de cada archivo que se extrae (por ejemplo, moksha-0.1.0/ABOUT-NLSse convierte en solo ABOUT-NLS). Debido a que tarha cambiado al nuevo mokshadirectorio, todo el contenido del archivo se extraerá allí.

El archivo que vinculó en su pregunta tiene solo un directorio en su raíz, pero es importante tener en cuenta que usar esta técnica en un archivo conmúltipleLos directorios en su raíz volcarán todo el contenido de esos directorios en el directorio especificado por -C. En tales casos, sería mejor para ustedextraer y luego cambiar el nombre según sea necesario.

información relacionada