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?

Robby75
fuente
¿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
toro2k
fuente
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 .
Andy Balaam
fuente
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.

Ian Roberts
fuente
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.

Tomasz Gandor
fuente