Anteponer prefijo en alquitrán


17

Actualmente lo hago en un shellscript de manera muy ineficiente:

cp -a $MYPATH /tmp/$VERSION
cd /tmp
tar cjf archive.tar.bz2 $VERSION

Quiero que todo esté contenido en el directorio llamado $ VERSION. ¿Hay alguna manera de hacerlo sin tener que copiar todo como en el script anterior?


¿Por qué copiarlo en primer lugar? ¿Por qué no tar cjf archive.tar.bz2 $MYPATH?
Chewie

2
@Chewie, dijo, quiere la versión $ como directorio principal en el archivo.
Kent

Oh, ya lo veo.
Chewie

Respuestas:


26

La versión GNU de taradmite la --transformopción (y su alias --xform), podría usarla así

tar --transform "s/^$MYPATH/$VERSION/" -cf archive.tar.bz2 "$MYPATH"

Por ejemplo, dado este árbol de directorios

foo
└── foo.txt

El comando

tar --transform "s/^foo/bar/" -cf foo.tar.bz2 foo

producirá un archivo como

$ tar -tf foo.tar.bz2
bar/
bar/foo.txt

3
Es de destacar que este enfoque podría romper los enlaces simbólicos. El anteponer flags=r;resuelve el problema como se menciona en stackoverflow.com/a/29661783/388803 .
eregon

no incluya una barra inclinada final; cuando pongo una barra diagonal en la transformación, se pierde el prefijo original; por ejemplo s/^a\//b\//, la imagen tar -tfija se muestra a/mientras todos los demás archivos están debajo b/; Supongo que esto es peligroso, y realmente no necesito protegerme contra algún otro archivo con el mismo prefijo que no sea un directorio en el archivo tar; así que no está bien la barra inclinada final, no me importaría saber la mejor manera de manejar el caso de la a/transformación, pero no aa/si fuera un hermano del nodo raíz.
ThorSummoner

15

Para tar el directorio actual y agregar un prefijo, esto funcionó para mí:

tar --transform 's,^\.,$VERSION,' -cf foo.tar .

0

Si puede escapar sin preservar los enlaces simbólicos dentro del árbol de archivos que está tratando, podría hacerlo

ln -s $MYPATH /tmp/$VERSION
cd /tmp
tar cjhf archive.tar.bz2 $VERSION

La hopción significa enlaces simbólicos de desreferencia, es decir, incluir el archivo o directorio al que apunta el enlace en lugar de simplemente registrar el hecho de que había un enlace simbólico y lo que señalaba.


0

Para agregar un prefijo de directorio cómodamente, use un separador diferente al /del --transformargumento, por ejemplo, +o ,como en la respuesta de Andy.

Entonces, para un caso más simple, tiene un montón de archivos en el directorio actual y no desea crear una tarbomb .

tar czf logs_nightly.tar.gz --tranform 's+^+logs_nightly/+' *.log

La sintaxis es s+search+replace+, y ^simplemente coincide con el inicio del nombre del archivo.

Y ahora, solo para responder al OP, bueno, puede evitar copiar todo su directorio /tmpejecutando:

mv $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION
mv $VERSION $MYPATH

Alternativamente:

ln $MYPATH $VERSION
tar cjf archive.tar.bz2 $VERSION

(enlace duro, evita problemas con enlaces simbólicos)

Los dos últimos se incluyeron por valor de entretenimiento, yo mismo me quedaría con la respuesta de toro2k.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.