2010-01-17 11:25:07 +0000 2010-01-17 11:25:07 +0000
32
32

Come tar la directory e poi rimuovere gli originali compresa la directory?

Sto cercando di tar una collezione di file in una directory chiamata ‘my\directory’ e rimuovere gli originali usando il comando:

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

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

EDIT:

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.

Comunque, il mio principale motivo per fare questa domanda deriva dalla gestione di tar dei percorsi assoluti. Poiché dovete specificare un percorso relativo a uno o più file da comprimere, dovete quindi passare alla directory madre per tararlo correttamente. Per come la vedo io, usare qualsiasi tipo di comando ‘rm’ successivo è potenzialmente pericoloso in quella situazione. Quindi speravo di semplificare le cose facendo fare a tar stesso la rimozione.

Per esempio, immaginate uno script di backup dove la directory per il backup (cioè tar) è inclusa come variabile di shell. Se il valore di quella variabile di shell è stato inserito male, è possibile che il risultato potrebbe essere la cancellazione di file da qualsiasi directory in cui vi siete trovati per ultimi.

Risposte (5)

19
19
19
2010-01-17 11:58:18 +0000

Poiché l'opzione --remove-files rimuove solo i file, potreste provare

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

in modo che la directory venga rimossa solo se l'opzione tar restituisce uno stato di uscita pari a 0

12
12
12
2010-01-17 11:42:11 +0000

Ti manca la parte che dice che l'opzione --remove-files rimuove i files dopo averli aggiunti all'archivio.

Potresti seguire l'operazione di archiviazione e rimozione 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 di Debian su, Bug 424692: –remove-files si lamenta che le directory “sono cambiate durante la lettura” .

7
7
7
2014-11-12 10:15:09 +0000

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
1
1
2010-10-04 19:58:41 +0000
source={directory argument}

e.g.

source={FULL ABSOLUTE PATH}/my_directory

 

parent={parent directory of argument}

e.g.

parent={ABSOLUTE PATH of 'my_directory'/

 

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

Poi si potrebbe eseguire qualcosa del tipo:

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
1
1
2011-11-14 13:21:38 +0000

Questo era probabilmente un bug.

Anche la parola “file” è ambigua in questo caso. Ma poiché questo è uno switch da linea di comando mi aspetterei di intendere anche directory, perché in unix/lnux tutto è un file, anche una directory. (L'altra interpretazione è naturalmente anche valida, ma non ha senso mantenere le directory in un caso simile. Lo considererei un comportamento inaspettato e confuso).

Ma ho trovato 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 un workaround fino a quando non l'hanno risolto.

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 root root 4096 2011-11-14 15:40 . drwxr-xr-x 16 root root 4096 2011-02-25 03:15 .. drwxr-xr-x 3 mit mit 4096 2011-11-14 15:40 tree1 mit:/var/tmp$ tar -czf tree1.tar.gz tree1/ --remove-files # AS YOU CAN SEE THE TREE IS GONE NOW: mit:/var/tmp$ ls -la drwxrwxrwt 3 root root 4096 2011-11-14 15:41 . drwxr-xr-x 16 root root 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 volete vederlo sulla vostra macchina, incollate questo in una console a vostro 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