it-swarm.it

Come scegliere il nome della directory durante l'estrazione

Supponiamo di avere un file chiamato ugly_name.tar, che una volta estratto diventa ugly_name directory. Quale comando posso usare in modo tale che il nome della directory risultante sia pretty_name anziché?

132
tshepang

Questo dovrebbe funzionare:

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

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

Si noti che questo non è davvero portatile. GNU tar e almeno alcuni dei tar BSD hanno il --strip-components opzione, ma non sembra esistere su altre piattaforme simili a unix.

Tuttavia, il modo stupido di farlo funzionerebbe praticamente ovunque.

tar xf ugly_name.tar && mv ugly_name pretty_name
187
Mat

Con GNU tar ≥1.16, usa --transform per 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 devi preoccuparti 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 invece.

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

Con pax , l'utilità di archiviazione POSIX, usa -s opzione, che accetta un'espressione sostitutiva sed-like come argomento.

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!'

Il modo più semplice

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

Usa questo :

tar -xvf ugly_name.tar
mv ugly_name pretty_name
9
Rupesh Mande

Da askUbuntu, questo risposta ha funzionato per me:

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

`--one-alto livello [= 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 in commenti , questo metodo non funziona per gli archivi che sono correttamente formati, tuttavia come mostra n'altra risposta , è necessario aggiungere --strip-components 1 perché funzioni davvero. Ho provato con questa nuova opzione e funziona sia per gli archivi con un nome di primo livello che per quelli senza.

3
smac89