tar: rimozione del carattere iniziale / / dai nomi dei membri


137
root@server # tar fcz bkup.tar.gz /home/foo/
tar: Removing leading `/' from member names

Come posso risolvere questo problema e conservare i /nomi dei file?


2
Cosa non funziona esattamente come previsto?

34
Non è un problema. Non si desidera tagliare le barre in un archivio tar. Sul serio. Se si desidera estrarre un archivio nella radice del sistema, specificare -C /durante l'estrazione.
ThiefMaster il

Risposte:


69

Utilizzare l' opzione --absolute-nameso -Pper disabilitare questa funzione.

tar fczP bkup.tar.gz /home/foo/

tar fcz bkup.tar.gz --absolute-names /home/foo

54
Questa è la risposta corretta, ma tieni presente che nella maggior parte dei casi, questo non è ciò che desideri , perché provoca un archivio che viene estratto in percorsi completi!
rubo77,

8
L'uso -C /dell'opzione come descritto nella risposta di @Marcus eliminerà il messaggio STDERR se questo è il tuo obiettivo principale.
Matt Sanders,

1
Come ha commentato @ rubo77, di solito questo non è il risultato atteso dal comando.
Alfredocambera,

3
Il più delle volte questo non è ciò che un utente desidera, semplicemente perché la maggior parte di loro non legge il manuale fino a quando non è necessario (non c'è nessuno che abbia tempo per quello). Quindi, sarebbe saggio, almeno, espandere la tua risposta, avvertendo le persone di non farlo a meno che non siano assolutamente sicuri di capirne l'effetto. Soprattutto essere accettato come risposta.
Mladen B.

1
Aggiunti esempi @Toskan
Barmar

89

Questa è in realtà una caratteristica, non un problema. Gli archivi con posizioni assolute rappresentano un rischio per la sicurezza. Gli aggressori potrebbero utilizzare tali archivi per indurre gli utenti a installare file in posizioni critiche del sistema.

Sì, potresti usare -P. Ma cosa c'è di sbagliato nel consentire a tar di rimuovere la barra, e semplicemente richiedere all'utente dell'archivio di eseguire esplicitamente l'estrazione nella directory principale? Quindi hanno un impatto consapevole sulle posizioni critiche del sistema e non possono farlo per caso.


5
A volte le funzionalità sono problemi. Ho trovato questo thread dopo aver impostato uno script di backup che invierebbe un'email con uno stato di uscita diverso da zero tar. Questo particolare messaggio stava causando la tarchiusura con uno stato di 1, che mi stava causando la ricezione di falsi avvisi e-mail su backup riusciti, semplicemente perché tarscrivevo questo messaggio su STDERR. Ho risolto questo problema usando la mia versione ottimizzata della soluzione di cd /path/to/network/share && tar -cJf scripts.backup.tar.xz -C / home/user/scripts 2>/dev/null || [send an email alert]
@Marcus

1
Penso che ci siano alcuni casi d'uso da utilizzare -P, ad esempio se stai fornendo una sorta di funzione di snapshot del filesystem in FUSE. Qualche volta potresti voler decomprimere un'istantanea in una directory specifica piuttosto che cwddal punto di vista dell'utente.
DIMMSum

81

Se vuoi sbarazzarti del fatto che "Rimozione di` / 'dai nomi dei membri "venga stampato su STDERR, ma vuoi comunque lasciare quelle barre come tar saggiamente di default, ho visto qui una soluzione eccellente dal commentatore timsoft.

La soluzione prevede l'uso dell'opzione -C per cambiare la directory nella radice (/), quindi specificare l'albero dei file da archiviare senza una barra iniziale, perché ora è necessario solo un percorso relativo. Questo fa la stessa cosa di un normale comando tar create, ma non è necessario lo stripping:

tar fcz bkup.tar.gz -C / home/foo/

Non funzionerà con backup incrementali. Ma una buona risposta
gajdipajti,

Inoltre non funziona se si desidera tarare i file indicati dall'espansione della shell (ad esempio tar c -C / home/foo/*), poiché la shell non è a conoscenza della radice modificata. Ma comunque una buona risposta per altri casi.
Boris,

1
-C /non funziona per me, punto. Non impedisce lo standard per me.
Acumenus,

3
@ABB assicurati che il percorso che segue -C / sia relativo.
Zurfyx,

Questo approccio funzionerà se un utente non dispone delle autorizzazioni per la directory principale?
Mladen B.

31

Un mese di ritardo, ma ho trovato la soluzione più appropriata per il mio caso (in uno script di shell) è andare alla directory principale ed eseguire il comando lì.

cd /var/www/
tar -czf mysite.gz mysite

Invece di:

tar -czf /var/www/mysite.gz /var/www/mysite

9
In effetti avresti potuto farlo usando: tar -zcvf mysite.gz -C / var / www / mysite / Il vantaggio di questo è che puoi eseguirlo da qualsiasi directory
alfredocambera

Grazie per l'aiuto. Questo è quello di cui avevo bisogno. Non volevo il percorso completo nel mio tarball, solo la cartella di destinazione.
Christia,

Probabilmente questo avrebbe dovuto essere accettato come una risposta corretta, credo.
Mladen B.

Non vedo come questo risponda alla domanda. È qualcosa di diverso che potrebbe essere fatto. ... ... ... Mi piace: Q: Come posso andare da Los Angeles a New York? A: Vai a San Francisco invece.
G-Man,

Sono d'accordo con @ G-Man. Ciò comporterà un file tar con una struttura di directory completamente diversa. In alcuni casi, quella struttura di directory è in realtà più appropriata in primo luogo, ma non risponde alla domanda.
Kevin Keane,

7

Ecco come ho fatto utilizzando il metodo di forza bruta: 2>&1 | grep -v "Removing leading".

Per esempio:

tar -cf "$BKUPDIR/${BKUPFILE}.tar" --overwrite --exclude '.*' --one-file-system "$SRCDIR" 2>&1 | grep -v  "Removing leading"

4
Il problema è che nasconde il codice di errore. Quindi, se si desidera controllare il codice di errore da tar in uno script bash, non restituirà 0 in caso di successo.
Brian,

@staticx, il codice di errore è 0 indipendentemente.
Acumenus,

1
@ABB Il mio tarcomando potrebbe restituire 2un errore irreversibile.
Jite,

1
@Brian puoi usare $ PIPESTATUS per ottenere il codice di uscita. Vedi unix.stackexchange.com/questions/14270/…
simpleuser

3

Prova a utilizzare -Csolo per il percorso che impedirebbe la compressione con percorsi completi:

root@server # tar fcz bkup.tar.gz -C /home/ foo/

2

Ho risolto questo problema con:

cd /home/foo && tar czf ~/backup.tar.gz .

in questo modo non stai cercando di inserire percorsi assoluti nell'archivio tar in primo luogo. Se si desidera decomprimerlo alla radice del file system, basta

cd / && tar xzf backupt.tar.gz dopo averlo trasferito.

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.