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

Como remover o directório de alcatrão e depois remover os originais incluindo o directório?

Estou a tentar tar uma colecção de ficheiros num directório chamado ‘my_directory’ e remover os originais usando o comando:

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

No entanto, está apenas a remover os ficheiros individuais dentro do directório e não o directório em si (que é o que eu especifiquei no comando). O que me está a faltar aqui?

EDIT:

Sim, suponho que a opção ‘remover ficheiros’ é bastante literal. Embora também eu tenha achado a página de homem pouco clara sobre esse ponto. (No linux tenho tendência a não distinguir muito entre directórios e ficheiros, e esqueço por vezes que eles não são a mesma coisa). Parece que o consenso é que não remove os directórios.

No entanto, o meu principal ponto de partida para fazer esta pergunta deriva do tratamento do alcatrão de caminhos absolutos. Porque é necessário especificar um caminho relativo para um ficheiro/s a ser comprimido, é necessário, portanto, mudar para o directório principal para o tar de forma adequada. Na minha opinião, a utilização de qualquer tipo de comando ‘rm’ de seguimento é potencialmente perigosa nessa situação. Assim, esperava simplificar as coisas, fazendo o próprio tar fazer a remoção.

Por exemplo, imagine um script de backup onde o directório para fazer o backup (ou seja, tar) é incluído como uma variável de shell. Se o valor dessa variável da shell foi mal introduzido, é possível que o resultado possa ser apagado de qualquer directório em que tenha estado por último.

Respostas (5)

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

Uma vez que a opção --remove-files apenas _ remove ficheiros_, pode tentar

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

para que o directório seja removido apenas se o tar devolver um estado de saída de 0

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

Falta-lhe a parte que diz que a opção --remove-files remove ** ficheiros*** depois de os adicionar ao arquivo.

Poderá seguir o arquivo e a operação de remoção de ficheiros com um comando como,

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


Actualização: Poderá estar interessado em ler esta pequena discussão Debian sobre, Bug 424692: –remove-files queixa-se de que os directórios “mudaram à medida que o lemos” .

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

Já tentou colocar a directiva –remove-files depois do nome do arquivo? Para mim funciona.

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}

Depois poderia executar algo na linha 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

0x1&

1
1
1
2011-11-14 13:21:38 +0000

Isto foi provavelmente um insecto.

Também a palavra “ficheiro” é ambígua neste caso. Mas como se trata de um interruptor de linha de comando, esperaria significar também directórios, porque em unix/lnux tudo é um ficheiro, também um directório. (A outra interpretação é obviamente também válida, mas não faz sentido manter directórios num caso destes. Considerá-lo-ia um comportamento inesperado e confuso).

Mas descobri que em gnu tar em algumas distribuições o gnu tar remove realmente a árvore de directórios. Outra indicação de que manter a árvore era um bug. Ou pelo menos algum trabalho até que a consertem.

Isto foi o que experimentei numa consola 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 quiser vê-lo na sua máquina, cole isto numa consola 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