Come scegliere il nome della directory durante l'estrazione


125

Supponiamo che io abbia un nome file ugly_name.tar, che una volta estratto diventa ugly_namedirectory. Quale comando posso usare in modo che il nome della directory risultante sia pretty_nameinvece?

Risposte:


172

Questo dovrebbe funzionare:

mkdir pretty_name && tar xf ugly_name.tar -C pretty_name --strip-components 1

-Cpassa alla directory specificata prima di decomprimere (o impacchettare). --strip-componentsrimuove il numero specificato di directory dai nomi dei file memorizzati nell'archivio.

Si noti che questo non è davvero portatile. Tar GNU e almeno alcune delle tar BSD hanno l' --strip-componentsopzione, ma non sembra esistere su altre piattaforme unix-like.

Tuttavia, il modo stupido di farlo funzionerebbe praticamente ovunque.

tar xf ugly_name.tar && mv ugly_name pretty_name

Penso che continuerò con la versione stupida :)
phunehehe,

28
@phunehehe: uno dei vantaggi della versione smart è che non devi sapere in anticipo quale sia il nome della directory non
scritta

2
Posso aggiungere che questo funziona per più di "Pretty_name". Puoi anche decomprimere in una directory specifica in questo modo. Esempio:tar -xvf /tmp/backupfiles.tar -C /var/www/
Generale Redneck,

2
Di solito uso il modo stupido e utilizzo i caratteri jolly nel caso in cui non so quale sarà il brutto nome o non voglio scriverlo. mv ugly-* pretty_name
David Grayson,

1
Il modo stupido non funziona se c'è già una ugly_namedirectory. A proposito, la bellezza è negli occhi di chi guarda.
kmiklas,

30

Con GNU tar ≥1.16, utilizzare --transformper applicare una trasformazione sed regexp a ciascun nome di file (la trasformazione viene applicata sul percorso completo nell'archivio):

tar xf foo.tar --transform 's!^ugly_name\($\|/\)!pretty_name\1!'

Se ugly_nameè il componente di livello superiore di tutti i nomi di file nell'archivio, non è necessario preoccuparsi di una corrispondenza precisa:

tar xf foo.tar --transform 's/ugly_name/pretty_name/'

Se non conosci il nome della directory di livello superiore, puoi comunque utilizzare questo metodo, anche se potresti preferire --strip-components.

tar xf foo.tar --transform 's!^[^/]\+\($\|/\)!pretty_name\1!'

Con paxl'utilità di archiviazione POSIX, utilizzare l' -sopzione, che accetta come sostituto un'espressione sostitutiva sed-like.

pax -rf foo.tar -s '!^ugly_name\($\|/\)!pretty_name\1!'
pax -rf foo.tar -s '/ugly_name/pretty_name/'
pax -rf foo.tar -s '!^[^/]\+\($\|/\)!pretty_name\1!'

9

Usa questo :

tar -xvf ugly_name.tar
mv ugly_name pretty_name

9
Puoi preferire utilizzare l' &&operatore elenco tra questi due comandi, quindi il secondo viene eseguito solo se il primo ha avuto esito positivo.
arte

1
Ciò potrebbe avere conseguenze indesiderate se ugly_nameesiste già una directory .
Drew Dormann,

7

Il modo più semplice

tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1

(1) Questo chiaramente non è il modo più semplice, come smac89 inviato una risposta che caratterizza --one-top-level=pretty_namesenza --strip-components 1. (2) Al contrario, la risposta accettata (pubblicata da Mat) è disponibile --strip-components 1senza --one-top-level=pretty_name. (3) Puoi spiegare perché la tua risposta, combinando queste opzioni, è migliore di una delle più vecchie? Si prega di non rispondere nei commenti; modifica la  tua risposta per renderla più chiara e completa.
G-Man,

forse un vero esempio può aiutarti a chiarire: `wget dev.mysql.com/get/Downloads/MySQL-5.7/… tar xvf mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz --one-top -level = mysql57 --strip-components 1 `
marquicus

Questa risposta è più elegante di quella con il punteggio più alto .
KaiserKatze,

--strip-component 1È richiesto @ G-Man , con il metodo mkdiro --strip-components 1, altrimenti si ottiene semplicemente pretty_name/ugly_name/.
davAA

Questo è davvero il modo più semplice
smac89 il

2

Da askUbuntu, questa risposta ha funzionato per me:

tar zxvf ugly_name.tgz --one-top-level=pretty_name

`-Alto livello --one [= DIR]'

Dice a tar di creare una nuova directory sotto la directory di estrazione (o quella passata a `-C ') e usarla per proteggersi dai tarbomb. In assenza dell'argomento dir, il nome della nuova directory sarà uguale al nome di base dell'archivio (nome del file meno il suffisso dell'archivio, se riconosciuto). Tutti i nomi dei membri che non iniziano con quel nome di directory (dopo le trasformazioni da `--transform 'e` --strip-components') avranno come prefisso. I suffissi dei nomi di file riconosciuti sono `.tar 'e tutti i suffissi di compressione riconoscibili da See -auto-compress .


Aggiornare

Come sottolineato nei commenti , questo metodo non funziona per gli archivi che sono stati formati correttamente, tuttavia, come mostra un'altra risposta , è necessario aggiungerlo --strip-components 1affinché funzioni davvero. Ho provato con questa nuova opzione e funziona sia per gli archivi con un nome di primo livello che per quelli senza.


Il problema è che non rinomina la directory di livello superiore, ma crea un nuovo livello, denominato pretty_name, con la directory di livello superiore originale all'interno di quella. Ad esempio, se tar xzf ugly_name.tgzcrei una directory chiamata ugly_name/, allora creerebbe il comando che hai fornito pretty_name/ugly_name/.
davAA

1
@davidA buon punto. Ho aggiornato la mia risposta per includere una correzione per questo
smac89
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.