Come estrarre i file in un'altra directory usando il comando 'tar'?


672

Ho pensato che tar archive.tar /users/mylocationavrebbe funzionato, ma non lo è. Come posso fare ciò?


1
Inoltre, -C, --directory DIR\n change to directory DIRdovrebbe piuttosto essere descritto come change output directory to DIR (will fail if DIR doesn't exist). Grazie @Mich. Vedi anche la risposta di @ Bryan_Larsen.
valido dal

1
@Ujjwal Sing: In effetti, la pagina man tar non è molto utile. Descrive "-C DIR" come "passa alla directory DIR". Ancora peggio: "tar -C mydir xf archive.tar" non funziona, mentre "tar xf archive.tar -C mydir" non funziona.
Pat Morin,

@PatMorin Per essere onesti, una volta capito l'argomento che chiama le convenzioni che stai usando, ha senso. Puoi anche fare tar xfC archive.tar mydiro tar -C mydir -xf archive.tar. Sta solo mescolando bandiere in stile tradizionale e GNU che rompe le cose, come ... è onestamente un po 'previsto. I flag tradizionali vengono passati tutti come un blob come primo argomento. Non puoi aspettarti che funzionino se non sono i primi. (Voglio dire, sì, è possibile interpretarlo comunque - il mio punto è che sarebbe al di sopra e al di là, non standard)
Nic Hartley l'

Risposte:


958

Per estrarre un archivio in una directory diversa da quella corrente, utilizzare l' opzione tar -C, o --directory, come in

tar -xf archive.tar -C /target/directory

Si noti che la directory di destinazione deve esistere prima di eseguire quel comando (può essere creata da mkdir /target/directory).

Leggi la pagina del manuale (comando:) man tarper altre opzioni.


Il percorso può essere rimosso: vale a dire solo recuperare il file
zzapper il

3
Se si tratta di un file più grande, quando si esegue il comando, non si ottiene alcun output per diversi secondi o addirittura minuti mentre funziona. È possibile risolvere questo problema aggiungendo il -vflag ( modalità dettagliata ) che elenca il nome di ciascun file mentre lo estrae.
IQAndreas,

Se hai problemi con questo, nota anche i --strip-components=1consigli dell'altra risposta.
DreadPirateShawn,


9
Non è sorprendente che, dopo tutti questi anni, con tutte le opzioni taraccumulate, non ci sia ancora un'opzione per creare la directory di output se non esiste ?
EM0

261

Nota che se il tuo tarball contiene già un nome di directory che desideri modificare, aggiungi l' --strip-components=1opzione:

tar xf archive.tar -C /target/directory --strip-components=1

2
Grazie. I download tramite wget / etc hanno sempre una directory 'parent'. Questa è la risposta completa imo - o dovrebbe essere annotata nella risposta sopra.
bshea,

Proprio quello che stavo cercando. --strip-componentsè così utile quando si eseguono provisioner che potrebbero utilizzare versioni diverse. In questo modo /target/directorypuò essere un nome generico, senza doversi preoccupare di come il provider ha scelto di nominare la propria cartella di archivio.
Jack_Hu, il

30

Combinazione delle risposte e dei commenti precedenti:

Per estrarre semplicemente il contenuto e creare la directory di destinazione se manca:

mkdir -p /target/directory && tar xf archive.tar -C /target/directory

Per estrarre e rimuovere anche la directory principale (primo livello) nella zip

mkdir -p /target/directory && tar xf archive.tar -C /target/directory --strip-components=1

20

Un'altra opzione è usare --one-top-level. Ciò creerà automaticamente una directory basata sul nome file dell'originale.

tar zxvf filename.tgz --one-top-level

Inoltre, se lo desideri, puoi specificare il tuo e tar lo creerà automaticamente.

tar zxvf filename.tgz --one-top-level=new_directory

3
Sto usando GNU tar 1.26 e ricevo un errore di opzione non riconosciuto per--one-top-level
Emma Strubell,

Questa è la risposta di cui avevo bisogno. Molto utile "non" per specificare il nome della directory o ricordare il codice speciale che farà riferimento al file per il nome. Grazie.
Ipocrito,

2

Quello che ho trovato interessante in relazione all'estrazione è che dipende da come hai creato l'archivio, vedi questo esempio

cd /tmp
mkdir folder
touch folder/file.txt

quando fai tar -zcvf folder.tar.gz foldertutto è come previsto = quando lo decomprimerai ora sarà non tarato (la cartella verrà creata, se l'hai rimossa) come /tmp/folder/.

Ma quando creerai tar as tar -zcvf tmp-folder.tar.gz /tmp/foldere lo decomprimerai nella cartella / tmp, il risultato sarà /tmp/tmp/folderdirectory! In tal caso, è necessario decomprimerlo in / -tar -xf tmp-folder.tar.gz -C /


1

Con tar 1.29, possiamo semplicemente aggiungere il nome della directory dopo il nome del file tar. Per esempio,

tar zxvf tar-file directory-name/
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.