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.