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.0
directorio; en lugar de eso, quiero cambiar el nombre de este moksha-0.1.0
directorio como moksha
, en lugar de colocarlo moksha-0.1.0
en 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 tar
página del manual:
--transformar=EXPRESIÓN, --xforma=EXPRESIÓN Usar reemplazo de sedEXPRESIÓNpara transformar nombres de archivos.
Probablemente sed
sea necesario para que esto funcione. Aunque si es así wget
, probablemente sed
tambié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 comomoksha
, 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: mv
no lee archivos fuente desde la entrada estándar. En este caso, lo mejor que puede hacer es tar
cambiar 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 -C
y --strip-components
en lugar de --transform
:
mkdir moksha && wget -c https://github.com/JeffHoogland/moksha/archive/0.1.0.tar.gz |
tar -xzC moksha --strip-components=1
( -C
voluntadno, 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 tar
no tiene --transform
) y no modificará los nombres de archivos que contengan la cadena moksha-0.1.0
en 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-NLS
se convierte en solo ABOUT-NLS
). Debido a que tar
ha cambiado al nuevo moksha
directorio, 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.