tar estrarre nella directory con lo stesso nome di base?


18

Ho un file compresso come myArchive123.tar.gz. Al suo interno contiene una cartella similehelloWorld

Se lo estraggo: tar -xf myArchive123.tar.gzottengo la helloWorldcartella:

ls 
myArchive123.tar.gz
helloWorld 

Vorrei che l'output fosse lo stesso nome del file meno l'estensione .tar.gz. Vale a dire:

tar <magic paramaters> myArchive123.tar.gz 
ls 
 myArchive123.tar.gz
 myArchive123
cd myArchive123
ls 
  helloWorld

Può essere fatto?

  • Non so mai cosa c'è dentro l'archivio. Potrebbe essere una cartella, potrebbe essere molti file.
  • Sarei d'accordo con l'uso di un altro strumento se tar non può farlo.
  • Starei bene con una forma più lunga che può essere trasformata in una sceneggiatura

EDIT
Nel frattempo mi sono hackerato una sceneggiatura che sembra portare a termine il lavoro. (vedi la mia risposta postata di seguito). Se può essere migliorato, non esitare a pubblicare commenti / risposte aggiuntive. La cosa principale è che dovrebbe essere impacchettabile in un one-liner come:

extract <file>

1
L'archivio contiene sempre esattamente una cartella?
Mark Plotnick,


Non so cosa ci sia dentro al momento dell'estrazione. Questo non dovrebbe dipendere neanche da cosa c'è dentro l'archivio. Se è una cartella, estrarre la cartella lì dentro. se è un file, estrarre tutti i file.
Leo Ufimtsev,

Nel frattempo ho messo insieme una sceneggiatura (vedi sotto). Posso accettare la risposta solo tra 2 giorni.
Leo Ufimtsev,

L'archivio conterrà mai più di una cartella al livello superiore?
Mark Plotnick,

Risposte:


10

Con gnu tar, è possibile utilizzare --xform(o --transform) per anteporre /prefix/a ciascun nome di file:

tar -xf myArchive.tar.gz --xform='s|^|myArchive/|S'

Nota non c'è leader /nel prefix/e le sedestremità di espressione con Sescludere target collegamento simbolico dal nome del file trasformazioni.
Per testarlo (a secco):

tar -tf myArchive.tar.gz --xform='s|^|myArchive/|S' --verbose --show-transformed-names

Per iniziare, ecco uno script molto semplicistico che potresti invocare come extract <file>:

STRIP = $ {1%. *} #Strip ultimo suffisso
NAME = $ {STRIP% .tar} #strip .tar suffisso, se presente
tar -xf "$ 1" --xform = "s | ^ | $ NAME / | S" #run comando

Questo è vicino a quello che voglio, con l'eccezione che mi piacerebbe essere in grado di impacchettarlo in qualcosa del tipo: extract <file>
Leo Ufimtsev

Questo è un bug, si ferma al primo punto. Ad esempio, ho un file come questo: eclipse-SDK-4.5M6-linux-gtk-x86_64.tar.gz Mi aspetto un output senza .tar.gz, ma ottengo eclipse-sdk-4
Leo Ufimtsev

Nello script sopra spoglio l'estensione e lo spoglio ulteriormente se trovo un 'tar'.
Leo Ufimtsev,

In generale, con molti tipi di archivi. Speravo in un one-liner veloce, ho pensato che forse mi mancava qualche bandiera argomento. Ma sembra che non ci sia una soluzione banale a questo?
Leo Ufimtsev,

Roba buona. Funziona ed è più breve della sceneggiatura che ho scritto. Bello!
Leo Ufimtsev,

7

Beh, potresti farlo almeno in un paio di passaggi. Se avete fatto

mkdir <archive name>
tar -xf <archive name>.tar.gz --strip-components=1 -C <archive name>

ciò compirebbe il compito, anche se potrebbe esserci ancora una risposta più compatta là fuori.


3

modificare

La risposta accettata è più breve della seguente. (fai la stessa cosa, ma di solito è più corto).


Alla fine mi sono hackerato una sceneggiatura per il compito da svolgere. funziona con .tar .tar.gz e .gz

#!/bin/sh
#usage:
# nameOfScript myArchive.tar.gz
# nameOfScript myArchive.gz
# nameOfScript myArchive.tar
#
# Result:
# myArchive   //folder
fileName="${1%.*}" #extracted filename

#handle the case of archive.tar.gz
trailingExtension="${fileName##*.}"
if [ "$trailingExtension" == "tar" ]  
then
    fileName="${fileName%.*}"  #remove trailing  tar.
fi

mkdir "$fileName"
tar -xf "$1" --strip-components=0 -C "$fileName"

Uso:

   nameOfScript archive.tar.gz 
   ls 
    archive
   cd archive 
   ls 
    <archive content>

Nota, questa soluzione è in grado di puntare in un nome di file. Ad esempio Eclipse-4.5M-SDK.tar.gz.

Tengo la sceneggiatura nel mio repository git. Per l'ultima versione, consultare: https://github.com/LeoUfimtsev/ldts/blob/master/pathscripts/leo-tar-here


2

Un'altra soluzione possibile sta usando l' --transformopzione:

tar -xzf ARCHIVE_NAME.tgz --transform="s/OLD_DIR_NAME/ARCHIVE_NAME/"

Con i tuoi file:

tar -xzf myArchive123.tar.gz --transform="s/helloWorld/myArchive123/"

1
ma questo presuppone che tu sappia cosa c'è dentro l'archivio
Leo Ufimtsev il

ad es. come lo trasformerei in uno script di una riga senza sapere cosa c'è dentro l'archivio?
Leo Ufimtsev,

Hai ragione. È solo una possibile soluzione come ho scritto qui ...
svq

c'è qualche differenza tra questo e --strip-compoments = 0 myArchive123?
Leo Ufimtsev,

1
E --strip-components=0rimuove semplicemente il nome della prima directory dal percorso e con l' -Copzione archivia i file de-archiviati nella nuova directory.
svq,
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.