creazione di un archivio tar senza includere la directory padre


63

Sto cercando di creare un programma grafico per la mia sceneggiatura.

All'interno dello script utilizzo tar per creare un archivio tar.

Dal programma grafico ottengo il nome completo del file che voglio creare un archivio tar.

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

Il mio archivio tar include home, username, dir1, dir2 e selecteddir mentre voglio che tar crei l'archivio includendo solo selecteddir.

Risposte:


79

È possibile utilizzare l' -Copzione di tarper eseguire ciò:

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

Dalla pagina man di 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.

sai come posso dividere $ path in Selecteddir e il percorso fino a / home / nomeutente / dir1 / dir2 in modo da poter utilizzare l'opzione -C
Sujit Maharjan

@SujitMaharjan è possibile utilizzare dirnameper estrarre tutto fino a "selecteddir" ed basenameestrarre "selecteddir". Prova i due comandi con $ path come argomento.
MK

2
Vale la pena aggiungere che questo è valido sia per GNU che per BSD Tar.
Luke Exton,

5
Nota che non puoi usare il globbing con l'opzione -C. tar -C /home/username/dir1/dir2 -cvf temp.tar '*.csv'non funzionerà.
Christian Long,

Non funziona: tar: selecteddir: impossibile stat: nessun file o directory del genere
tribbloid

11

Esistono due metodi che è possibile utilizzare per affrontare questo problema.

Il primo, secondo me, è più facile. Semplicemente cdnella directory direttamente sopra quella che vuoi comprimere. In questo caso sarebbe dir2.

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

Il secondo modo è usare l'opzione --transformche accetta sedun'espressione e la esegue contro i nomi dei file. Nota: si dovrà fuggire /nella sedespressione.

$ tar -cvf temp.tar /home/username/dir1/dir2/selecteddir --transform='s/\/home\/username\/dir1\/dir2\///g'

Il primo metodo ha bisogno di un punto (.) Alla fine? Ho provato senza e ottenuto: tar: Cowardly refusing to create an empty archive. Quando ho il punto, fa in modo fastidioso che la radice contenga una directory chiamata .. Quindi, vicino ma non perfetto.
JW01

1
Oltre al mio commento precedente. Ho risolto il mio problema. $ cd /home/username/dir1/dir2/ && tar -cvf temp.tar selecteddir *ha funzionato per me. Usando l'asterisco invece di un punto .. Aggiornamento: Woops - Anche se ho perso i file nascosti.
JW01

6

Innanzitutto, vai alla directory di lavoro,

cd /your/working/directory/ 

Quindi usa la magia *:-)

tar -cvf temp.tar *

Sto cercando di archiviare le directory nascoste e se le aggiungo direttamente (No *) funziona, ma quando uso * aggiunge solo il nome dell'archivio all'archivio ...
Ole,

2

In realtà, ho riscontrato un problema usando la risposta di Ketan

tar -C / home / nomeutente / dir1 / dir2 -cvf temp.tar Selecteddir

Quando vuoi solo copiare tutti i file solo in dir2, solo tutti i file allora esco per primo l'idea:

tar -C / home / nome utente / dir1 / dir2 -cvf temp.tar *

Tuttavia, quando non ci si trova nella directory dir2, ciò causerebbe un problema poiché * verificherebbe i file nella diectroy corrente. E ho risolto il problema usando il comando seguente:

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

7
Ma poi il tuo archivio temp.tar contiene .come cartella principale.
cgrim,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.