it-swarm-eu.dev

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

Sto provando a tar una raccolta di file in una directory chiamata 'mia_directory' e rimuovo gli originali usando 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 manca qui?

EDIT:

Sì, suppongo che l'opzione 'remove-files' sia abbastanza letterale. Anche se ho trovato la pagina man poco chiara su questo punto. (In Linux tendo a non distinguere molto 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 punto di partenza per porre questa domanda deriva dalla gestione dei percorsi assoluti da parte di tar. Poiché è necessario specificare un percorso relativo per un file/i da comprimere, è quindi necessario passare alla directory padre per assegnarlo correttamente. Come vedo che usare qualsiasi tipo di comando 'rm' di follow-on è potenzialmente pericoloso in quella situazione. Così 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 (ad esempio tar) è inclusa come variabile Shell. Se il valore della variabile Shell è stato inserito male, è possibile che il risultato possa essere cancellato da qualsiasi directory in cui ci si trova per ultimo.

28
Nicholas

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

È possibile seguire l'operazione di archiviazione e di 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 Debian su,
Bug 424692: --remove-files si lamenta che le directory "sono cambiate mentre la leggiamo" .

10
nik

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

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

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

17
pavium

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

tar -cvf files.tar --remove-files my_directory
5
Robert Grubba

Questo era probabilmente un bug.

Anche il "file" di Word è ambiguo in questo caso. Ma poiché si tratta di un commutatore a riga di comando, mi aspetto che intenda anche le directory, perché in unix/lnux tutto è un file, anche una directory. (Anche l'altra interpretazione è ovviamente valida, ma non ha senso mantenere le directory in questo caso: 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 tenere l'albero era un insetto. O almeno qualche soluzione alternativa fino a quando non l'hanno risolto.

Questo è quello che ho provato su una console di 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 
 
 # COME PUOI VEDERE L'ALBERO IS DISPONIBILE ORA: 
 
 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 --versione 
 tar (GNU tar) 1.22 
 Copyright © 2009 Free Software Foundation, Inc . 
 

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

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