Risposte:
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
tar -xvf /tmp/backupfiles.tar -C /var/www/
mv ugly-* pretty_name
ugly_namedirectory. A proposito, la bellezza è negli occhi di chi guarda.
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!'
Usa questo :
tar -xvf ugly_name.tar
mv ugly_name pretty_name
&&operatore elenco tra questi due comandi, quindi il secondo viene eseguito solo se il primo ha avuto esito positivo.
ugly_nameesiste già una directory .
Il modo più semplice
tar xvf dml/ugly_name.tar --one-top-level=pretty_name --strip-components 1
--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.
--strip-component 1È richiesto @ G-Man , con il metodo mkdiro --strip-components 1, altrimenti si ottiene semplicemente pretty_name/ugly_name/.
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 .
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.
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/.