File .tar senza struttura di directory


32

Sto .tareseguendo alcuni file con il percorso example/super_user/Output.*.

Il risultato .tarè simile al seguente:

+ example
    + super_user
          - Output.zip
          - Output.xml
          - Output.txt

Ma voglio che il file sia simile al seguente:

- Output.zip
- Output.xml
- Output.txt

Sai come posso raggiungere questo obiettivo pur essendo ancora in un'altra directory?


Assicurati di evitare le bombe con archivi del genere.
Grawity,

tar --strip-components = 1000?
Zaar Hai,

Risposte:


11

tar manterrà la struttura dei file e delle cartelle, quindi non credo che ci sia modo di istruire tar per appiattire la gerarchia al momento della creazione.

Una soluzione alternativa consiste nel cambiare temporaneamente la directory, creare il tar, quindi tornare indietro - un breve esempio di seguito:

cd example/super_user && tar -cvf ../../result.tar Output.* && cd ../..

27

Se la directory 'esempio' è alla radice del filesystem, ecco un altro modo:

tar -C /example/super_user -cvf result.tar .

questo cambierà directory nel punto in cui si desidera eseguire il tar. L'avvertenza è che se ci sono delle sottodirectory in / esempio / super_utente, la struttura delle directory verrà preservata per queste sottodirectory.


1
Questa è la risposta al problema attuale. L'avvertenza menzionata non è un problema in questo caso. Tutte le altre risposte sono soluzioni alternative per tenere conto delle variazioni del problema.
joki,

Questa è davvero la soluzione a questa domanda. La directory non deve essere la radice, supponendo che la struttura della directory /home/u/foo/bar, dir funzionante /home/b, quindi tar -C foo/bar -cvf qiz.tar .funziona bene. Un avvertimento, tuttavia, è che non è possibile utilizzare caratteri jolly, ovvero tar -C foo/bar -cvf qiz.tar *.log, tar -C foo/bar -cvf qiz.tar "*.log"o tar -C foo/bar -cvf qiz.tar "foo/bar/*.log"non funzionerà.
Brice,

1
Va notato che è possibile utilizzare -Cpiù volte in un singolo tarcomando se è necessario aggiungere più file distribuiti su più directory ma si desidera comunque che il file tar sia piatto.
zero298

10

Ho pubblicato la mia risposta qui:

https://stackoverflow.com/questions/13924856/unix-tar-do-not-preserve-directory-structure

ripubblicare (per ppl pigro)


Questo è brutto ... ma funziona ...

Ho avuto lo stesso problema, ma con più cartelle, volevo solo eliminare tutti i file. Puoi usare l'opzione "trasforma" per passare un'espressione sed e ... funziona come previsto.

questa è l'espressione:

's/.*\///g' (elimina tutto prima di '/')

Questo è il comando finale:

tar --transform 's/.*\///g' -zcvf tarballName.tgz */*/*.info


7

Per creare un tar (ARCHIVE.tar) con tutti i file da una directory (DIR), senza alcuna informazione sulla directory principale (nemmeno ./), puoi usare qualcosa come:

find "DIR" -type f -printf "%f\n" | xargs tar cf ARCHIVE.tar -C "DIR"

Puoi giocare con la ricerca per limitare la profondità, selezionare file specifici e molte altre cose.

In bocca al lupo!


Ricevo "trova: -printf: primario o operatore sconosciuto" al comando find di OSX. Qualche consiglio?
TCB13,

-printfè un comando non standard. Molti di questi funzionano solo con versioni specifiche di find. Di solito contrassegniamo quelli quando rispondiamo a una domanda su Super User (ad es. Con "-blah è un'estensione Gnu e non funzionerà ovunque").
Hennes,

3

Ho creato una directory temporanea. E nella directory, creato collegamenti simbolici a tutti i file ai file da includere. Poi ho fatto tar -h -C. in modo che tutti i file (non i collegamenti, ma il loro contenuto) siano inclusi nell'archivio con il nome desiderato.


1

Se questi sono l'intero contenuto del tarball, puoi usare l' --strip-componentsopzione GNU tar per rimuovere i 2 livelli prima dei file.


Ho solo l'opzione, --strip-pathma usarla non cambierà nulla.

1

Un altro modo per modificare temporaneamente la directory è inserire i comandi cde tartra parentesi ( ):

(cd example/super_user; tar -cvf ../../result.tar *)

Il vantaggio di questo è che tornerai sempre implicitamente alla directory originale quando il blocco è terminato. cioè non c'è bisogno di blocchi pushd.. popdo tenere traccia di dove cdtornare.


0
pushd example/super_user
tar -cf output.tar Output.*
popd

pushd sposta il percorso della directory corrente nello DIRstack e passa alla cartella del contenuto. Quindi, si torna alla directory originale utilizzando popd.

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.