Come tar directory e quindi rimuovere gli originali inclusa la directory?


30

Sto provando a taruna raccolta di file in una directory denominata "directory_mia" e rimuovere gli originali utilizzando il comando:

tar -cvf files.tar my_directory --remove-files

Tuttavia, rimuove solo i singoli file all'interno della directory e non la directory stessa (che è ciò che ho specificato nel comando). Cosa mi sto perdendo qui?

MODIFICARE:

Sì, suppongo che l'opzione 'remove-files' sia abbastanza letterale. Anche se anch'io ho trovato la pagina man poco chiara su questo punto. (In Linux tendo a non distinguere molto tra directory e file e dimentico a volte che non sono la stessa cosa). Sembra che il consenso sia che non rimuove le directory.

Tuttavia, il mio principale suggerimento per porre questa domanda deriva dalla gestione dei percorsi assoluti da parte di tar. Poiché è necessario specificare un percorso relativo di un file / i da comprimere, è quindi necessario passare alla directory padre per tararlo correttamente. A mio modo di vedere, usare qualsiasi tipo di comando 'rm' di follow-on è potenzialmente pericoloso in quella situazione. Quindi speravo di semplificare le cose facendo in modo che tar stesso facesse la rimozione.

Ad esempio, immagina uno script di backup in cui la directory di backup (es. Tar) sia inclusa come variabile di shell. Se il valore della variabile shell non è stato inserito correttamente, è possibile che il risultato possa essere eliminato da qualsiasi directory in cui ci si è trovati per ultimo.


Nicholas, il punto che aggiunge il pericolo di dover rimuovere l'albero delle directory in un passaggio aggiuntivo è assolutamente valido. Penso che dovrebbe essere possibile farlo in modo sicuro dall'archiviatore. Credo anche che questa fosse l'intenzione dei creatori di GNU tar, almeno avrebbe dovuto essere ;-)
mit

2
Ho scoperto che l'opzione --remove-files rimuove effettivamente la directory contenente - almeno su alcune piattaforme / in alcune versioni - e nel mio caso. Potrebbe essere che nel tuo caso la directory rimanente non fosse completamente vuota a causa di alcuni file modificati dopo essere stati tarati.
isync,

@isync Mi sembra di sperimentare --remove-files che cancella le directory su Ubuntu 14.04. Tranne nel mio caso, non lo voglio. Haha
Bradley Odell il

Risposte:


12

Manca la parte che dice che l' --remove-filesopzione rimuove i file dopo averli aggiunti all'archivio.

È possibile seguire l'operazione di rimozione dell'archivio e dei file con un comando come,

find / path / to / be / archived / -depth -type d -empty -exec rmdir {} \;


Aggiornamento: potresti essere interessato a leggere questa breve discussione su Debian su
Bug 424692: --remove-files si lamenta che le directory "sono cambiate mentre la leggiamo" .


Forse in realtà è: -ccambia directory prima di tariniziare il suo lavoro (e il tipo di non ritorna fino a quando non è fatto)? Mi immagino che sarebbe cancellato sottodirectory, se coloro che sono stati inclusi in archivio (ma non ho ancora testato questo).
Arjan,

@Arajan, non credo ' c'abbia nulla a che fare con questo; 'remove-files'intenzionalmente non rimuove le directory.
nik,

Ah, trovo la breve spiegazione "rimuovi i file dopo averli aggiunti all'archivio" dalle manpagine non troppo chiare su questo, ma presumo che tu abbia ragione. Tuttavia, non mi aspetto che la directory menzionata -cvenga rimossa anche se tar rimuovessero anche le directory. (Per me, sarebbe come rimuovere la directory corrente, quindi includendo l'archivio stesso, quando non si usa -c...?) Ma se -remove-fileslascia sempre le directory al loro posto, sicuramente sto solo complicando le cose qui. ;-)
Arjan il

3
--remove-filesil bug è stato corretto in tar-1.19.
X-yuri,

19

Poiché l' --remove-filesopzione rimuove solo i file , puoi provare

tar -cvf files.tar my_directory && rm -R my_directory

in modo che la directory venga rimossa solo se tarrestituisce uno stato di uscita pari a 0


9
tranne che dovresti controllare lo stato di uscita di tar prima di fare l'rm! altrimenti potresti rimanere senza archivio tar e senza file ...
Kim

1
Quando uso le directory di un livello, credo che un'opzione più sicura userebbe "rmdir" anziché "rm" in quanto rimuoverà solo una directory vuota. [Vedi modifica delle domande]
Nicholas

Ma rmdirrimuove solo le directory vuote . L'idea era di rimuovere la directory e i file in essa contenuti (a condizione che tar
abbiano

--remove-filesil bug è stato corretto in tar-1.19.
X-yuri,

&& eseguirà il comando seguente solo se il comando precedente è uscito da 0 (esito positivo). Se esce> 0, il seguente comando non verrà eseguito. Puoi anche invertire ciò con || - eseguito solo se il primo comando non è riuscito. Un buon modo per fare un controllo dei contenuti terribili riavvia quello.
Kirrus,

6

Hai provato a mettere la direttiva --remove-files dopo il nome dell'archivio? Per me funziona.

tar -cvf files.tar --remove-files my_directory

1
È più probabile che il comportamento di tar sia cambiato da quando è stata posta questa domanda. Per me, non c'è differenza nel mettere --remove-filesprima o dopo my_directory; in entrambi i casi, la directory viene rimossa.
Redburn,

5
--remove-filesil bug è stato corretto in tar-1.19.
X-yuri,

1
source={directory argument}

per esempio

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

per esempio

parent={ABSOLUTE PATH of 'my_directory'/

 

logFile={path to a run log that captures status messages}

Quindi potresti eseguire qualcosa sulla falsariga di:

cd ${parent}

tar cvf Tar_File.`date%Y%M%D_%H%M%S` ${source}

if [ $? != 0 ]

then

 echo "Backup FAILED for ${source} at `date` >> ${logFile}

else

 echo "Backup SUCCESS for ${source} at `date` >> ${logFile}

 rm -rf ${source}

fi

1

Questo probabilmente era un bug.

Anche la parola "file" è ambigua in questo caso. Ma poiché si tratta di un interruttore della riga di comando, mi aspetterei di significare anche le directory, perché in unix / lnux tutto è un file, anche una directory. (L'altra interpretazione è ovviamente valida, ma non ha senso tenere le directory in questo caso. Considererei un comportamento inaspettato e confuso.)

Ma ho scoperto che in gnu tar su alcune distribuzioni gnu tar rimuove effettivamente l'albero delle directory. Un'altra indicazione che mantenere l'albero era un bug. O almeno qualche soluzione alternativa fino a quando non lo risolvono.

Questo è quello che ho provato su una console Ubuntu 10.04:

mit: / var / tmp $ mkdir tree1                                                                                               
mit: / var / tmp $ mkdir tree1 / sub1                                                                                          
mit: / var / tmp $> tree1 / sub1 / file1                                                                                        

mit: / var / tmp $ ls -la                                                                                                    
drwxrwxrwt 4 radice radice 4096 2011-11-14 15:40.                                                                              
drwxr-xr-x 16 radice radice 4096 2011-02-25 03:15 ..
drwxr-xr-x 3 mit 4096 2011-11-14 15:40 tree1

mit: / var / tmp $ tar -czf tree1.tar.gz tree1 / --remove-files

# COME PUOI VEDERE L'ALBERO È ANDATO ORA:

mit: / var / tmp $ ls -la
drwxrwxrwt 3 radice radice 4096 2011-11-14 15:41.
drwxr-xr-x 16 radice radice 4096 2011-02-25 03:15 ..
-rw-r - r-- 1 mit mit 159 2011-11-14 15:41 tree1.tar.gz                                                                   


mit: / var / tmp $ tar --version                                                                                             
tar (GNU tar) 1.22                                                                                                           
Copyright © 2009 Free Software Foundation, Inc.

Se vuoi vederlo sul tuo computer, incollalo in una console a tuo rischio e pericolo:

tar --version                                                                                             
cd / var / tmp
mkdir -p tree1 / sub1                                                                                          
> tree1 / sub1 / file1                                                                                        
tar -czf tree1.tar.gz tree1 / --remove-files
ls -la
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.