Evitare errori di tar non riusciti a ripristinare le autorizzazioni della directory


13

Osservo il seguente comportamento con tar 1.26 e 1.27.1:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b -xvf test.tar diffowner
diffowner/
diffowner/foo
tar: diffowner: Cannot utime: Operation not permitted
tar: diffowner: Cannot change mode to rwxr-xr-x: Operation not permitted
tar: Exiting with failure status due to previous errors

Quindi quello che sto cercando di fare qui è estrarre un file tar in una struttura di directory esistente, dove non sono il proprietario di tutte le directory coinvolte ma ho il permesso di scrivere su tutte. In realtà sono condivisi tra un gruppo.

Non mi importa dei timestamp e confido che le autorizzazioni dovrebbero essere già corrette. Sto eseguendo questo come un normale utente, quindi non dovrebbe provare a --preserve-permissionsmeno che non sia stato detto, cosa che non ho fatto. Quello che mi preoccupa davvero è lo stato di uscita: intendo usarlo in uno script e voglio sapere se l'estrazione effettiva ha funzionato bene.

Esiste un'opzione per tar che gli dice di non impostare i permessi della directory, né immediatamente né in ritardo? In caso contrario, quali altre soluzioni suggeriresti. In questo momento sto pensando di estrarre in una directory temporanea e usare rsyncper spostare roba nell'albero esistente. Ma forse conosci un approccio meno aggressivo.


1
Ti chiedi se c'è un modo per farlo al momento della creazione del catrame rispetto all'estrazione ...?
Roy Truelove,

Risposte:


22

Questa taropzione potrebbe essere quella che stai cercando:

 --no-overwrite-dir
       preserve metadata of existing directories

Ho testato come segue:

$ mkdir a b a/diffowner
$ sudo mkdir b/diffowner
$ sudo chmod a+w b/diffowner
$ echo foo > a/diffowner/foo
$ tar -C a -cvf test.tar diffowner
diffowner/
diffowner/foo
$ tar -C b --no-overwrite-dir -xvf test.tar diffowner
diffowner/
diffowner/foo
$ echo $?
0

1
Ha funzionato anche per il mio caso, in cui ho estratto un archivio tar su una condivisione Samba montata. Notare che a differenza del comando suggerisce, sopprime anche l'errore quando la destinazione è vuota (cioè tutte le directory che darebbero errori sono state create da tar stesso). Grazie ancora!
user149408,
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.