Risposte:
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. Tar GNU e almeno alcune delle tar BSD hanno l' --strip-components
opzione, 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_name
directory. A proposito, la bellezza è negli occhi di chi guarda.
Con GNU tar ≥1.16, utilizzare --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 è 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 pax
l'utilità di archiviazione POSIX, utilizzare l' -s
opzione, 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_name
esiste 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_name
senza --strip-components 1
. (2) Al contrario, la risposta accettata (pubblicata da Mat) è disponibile --strip-components 1
senza --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 mkdir
o --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 1
affinché 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.tgz
crei una directory chiamata ugly_name/
, allora creerebbe il comando che hai fornito pretty_name/ugly_name/
.