crear un archivo tar sin incluir el directorio padre

62

Estoy tratando de crear un programa gráfico para mi script.

Dentro del script, uso tar para crear un archivo tar.

Del programa gráfico obtengo el nombre completo del archivo que quiero crear un archivo tar.

tar -cvf temp.tar /home/username/dir1/dir2/selecteddir 

Mi archivo tar incluye home, username, dir1, dir2 y selecteddir, mientras que quiero que tar cree un archivo que solo incluya selecteddir.

Sujit Maharjan
fuente

Respuestas:

79

Puede usar la -Copción de tarlograr esto:

tar -C /home/username/dir1/dir2 -cvf temp.tar selecteddir

De la página del manual de tar:

-C directory
         In c and r mode, this changes the directory before adding the following files.  
         In x mode, change directories after opening the archive but before extracting 
         entries from the archive.
mkc
fuente
¿sabes cómo puedo dividir $ path en selectdir y path up / / home / username / dir1 / dir2 para poder usar la opción -C?
Sujit Maharjan
@SujitMaharjan puedes usar dirnamepara extraer todo hasta "selecteddir" y basenamepara extraer "selecteddir". Pruebe los dos comandos con la ruta $ como argumento.
mkc
2
Vale la pena agregar que esto es válido tanto para GNU como para BSD Tar.
Luke Exton el
55
Tenga en cuenta que no puede usar globbing con la opción -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'no funciona
Christian Long
No funciona: tar: selecteddir: No se puede estadísticas: No
existe
11

Hay dos métodos que puede usar para abordar este problema.

El primero, en mi opinión, es más fácil. Simplemente cden el directorio directamente encima del que desea comprimir. En este caso lo sería dir2.

$ cd /home/username/dir1/dir2/
$ tar -cvf temp.tar selecteddir

La segunda forma es usar la opción --transformque toma una sedexpresión y la ejecuta contra los nombres de los archivos. Nota: deberás escapar /en la sedexpresión.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'
ryanmjacobs
fuente
¿El primer método necesita un punto (.) Al final? Lo probé y me sin: tar: Cowardly refusing to create an empty archive. Cuando tengo el punto, molestamente hace que la raíz contenga un directorio llamado .. Entonces, cerca pero no perfecto.
JW01
1
Además de mi comentario anterior. Resolví mi problema. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *trabajó para mi. Usando asterisco en lugar de un punto .. Actualización: Woops: aunque perdí los archivos ocultos.
JW01
6

Primero, ve al directorio de trabajo,

cd /your/working/directory/ 

Entonces usa magia *:-)

tar -cvf temp.tar *
Yas
fuente
Estoy tratando de archivar directorios ocultos y si los agrego directamente (No *) funciona, pero cuando uso * solo agrega el nombre del archivo al archivo ...
Ole
1

En realidad, encontré un problema al usar la respuesta de Ketan

tar -C / home / username / dir1 / dir2 -cvf temp.tar selecteddir

Cuando quiera copiar todos los archivos solo en dir2, solo todos los archivos, primero se me ocurre la idea:

tar -C / home / username / dir1 / dir2 -cvf temp.tar *

Sin embargo, cuando no está en el directorio dir2, causaría problemas ya que * archivaría los archivos tar en su diectroy actual. Y arreglé el problema usando el siguiente comando:

 tar -C /home/username/dir1/dir2 -cvf temp.tar ./
Guan YANG
fuente
66
Pero entonces su archivo temp.tar contiene .como una carpeta raíz.
cgrim