Como tar diretório e, em seguida, remover originais, incluindo o diretório?

27

Estou tentando tar uma coleção de arquivos em um diretório chamado 'my_directory' e removo os originais usando o comando:

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

No entanto, é apenas remover os arquivos individuais dentro do diretório e não o próprio diretório (que é o que eu especifiquei no comando). O que estou perdendo aqui?

EDITAR:

Sim, suponho que a opção "remover arquivos" seja literal. Embora eu também achasse a página man desconhecida naquele ponto. (No linux, eu não costumo distinguir muito entre diretórios e arquivos, e às vezes esqueço que eles não são a mesma coisa). Parece que o consenso é que ele não remove diretórios.

No entanto, o meu maior ponto de incentivo para essa pergunta vem do manuseio de caminhos absolutos pelo alcatrão. Como você deve especificar um caminho relativo para um arquivo / s a ser compactado, você deve, portanto, mudar para o diretório pai para tar corretamente. Como eu vejo isso usando qualquer tipo de comando 'rm', é potencialmente perigoso nessa situação. Assim, eu estava esperando simplificar as coisas fazendo o próprio tar fazer a remoção.

Por exemplo, imagine um script de backup em que o diretório para backup (ou seja, tar) esteja incluído como uma variável do shell. Se o valor da variável shell foi mal digitado, é possível que o resultado possa ser arquivos deletados de qualquer diretório que você tenha passado.

    
por Nicholas 17.01.2010 / 12:25

5 respostas

10

Você está perdendo a parte que diz que a opção --remove-files remove arquivos depois de adicioná-los ao arquivo.

Você pode seguir a operação de arquivamento e remoção de arquivos com um comando como

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

Atualização: Você pode estar interessado em ler esta breve discussão Debian sobre, Bug 424692 : --remove-files reclama que os diretórios "mudaram conforme lemos" .

    
por 17.01.2010 / 12:42
16

Como a opção --remove-files apenas remove arquivos , você pode tentar

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

para que o diretório seja removido somente se o tar retornar um status de saída de 0

    
por 17.01.2010 / 12:58
5

Você tentou colocar a diretiva --remove-files após o nome do arquivo? Funciona para mim.

tar -cvf files.tar --remove-files my_directory
    
por 12.11.2014 / 11:15
1

Este foi provavelmente um bug.

Além disso, a palavra "file" é ambígua neste caso. Mas como este é um switch de linha de comando, eu esperaria significar também diretórios, porque no unix / lnux tudo é um arquivo, também um diretório. (A outra interpretação também é válida, mas não faz sentido manter diretórios em tal caso. Eu consideraria um comportamento inesperado e confuso.)

Mas eu descobri que no gnu tar em algumas distribuições o gnu tar na verdade remove a árvore de diretórios. Outra indicação de que manter a árvore era um erro. Ou, pelo menos, alguma solução até consertá-lo.

Isso é o que eu experimentei em um console do 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 você quiser vê-lo em sua máquina, cole isso em um console por sua conta e risco:

tar --version                                                                                             
cd /var/tmp
mkdir -p tree1/sub1                                                                                          
> tree1/sub1/file1                                                                                        
tar -czf tree1.tar.gz tree1/ --remove-files
ls -la
    
por 14.11.2011 / 14:21
1
source={directory argument}

por exemplo,

source={FULL ABSOLUTE PATH}/my_directory

parent={parent directory of argument}

por exemplo,

parent={ABSOLUTE PATH of 'my_directory'/

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

Então você poderia executar algo nos moldes de:

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
    
por 04.10.2010 / 21:58

Tags