Estou tentando tar
uma coleção de arquivos em um diretório chamado 'my_directory' e remova os originais usando o comando:
tar -cvf files.tar my_directory --remove-files
No entanto, está apenas removendo 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 bastante literal. Embora eu também ache a página de manual pouco clara nesse ponto. (No linux, eu não costumo distinguir muito isso 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 os diretórios.
No entanto, meu principal argumento para fazer essa pergunta decorre do manuseio de caminhos absolutos pelo tar. Como você deve especificar um caminho relativo para um arquivo / s a ser compactado, você deve, portanto, mudar para o diretório pai para tarar corretamente. Na minha opinião, usar qualquer tipo de comando 'rm' subsequente é potencialmente perigoso nessa situação. Assim, eu esperava simplificar as coisas, fazendo o próprio tar remover.
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 esse valor da variável do shell tiver sido digitado incorretamente, é possível que o resultado possa ser excluído dos arquivos do diretório em que você esteve por último.
Respostas:
Está faltando a parte que diz que a
--remove-files
opção remove os arquivos depois de adicioná-los ao arquivo morto.Você pode seguir a operação de arquivamento e remoção de arquivos com um comando como,
Atualização: Você pode estar interessado em ler esta breve discussão sobre o Debian,
Bug 424692: --remove-files reclama que os diretórios "mudaram à medida que o lemos" .
fonte
-c
altera o diretório antes detar
iniciar seu trabalho (e meio que não retorna até que seja feito)? Eu acho que ele teria excluído subdiretórios, se eles estivessem incluídos no arquivo (mas eu não testei isso).c'
tenha algo a ver com isso;'remove-files'
intencionalmente não remove diretórios.man
páginas não muito claras, mas presumo que você esteja certo. Ainda assim, eu não esperaria o diretório mencionado para-c
ser removido, mesmo setar
fez diretórios remove também. (Para mim, seria como remover o diretório atual, incluindo o próprio arquivo quando não estiver usando-c
...?) Mas se-remove-files
sempre deixar os diretórios no lugar, certamente estou apenas complicando as coisas aqui. ;-)--remove-files
bug foi corrigidotar-1.19
.Como a
--remove-files
opção remove apenas arquivos , você pode tentarpara que o diretório seja removido apenas se
tar
retornar um status de saída 0fonte
rmdir
apenas remove diretórios vazios . A idéia era para remover o diretório e os arquivos nele (desde quetar
seja bem sucedido)--remove-files
bug foi corrigidotar-1.19
.Você tentou colocar a diretiva --remove-files após o nome do arquivo? Funciona para mim.
fonte
--remove-files
antes ou depoismy_directory
; nos dois casos, o diretório é removido.--remove-files
bug foi corrigidotar-1.19
.por exemplo
por exemplo
Então você pode executar algo como:
fonte
Provavelmente foi um bug.
Também a palavra "arquivo" é ambígua neste caso. Mas como esta é uma opção de linha de comando, seria de esperar também diretórios, porque no unix / lnux tudo é um arquivo, também um diretório. (A outra interpretação também é válida, é claro, mas não faz sentido manter diretórios nesse 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 bug. Ou, pelo menos, alguma solução alternativa até corrigi-lo.
Isto é o que eu tentei em um console do ubuntu 10.04:
Se você quiser vê-lo em sua máquina, cole-o em um console por sua conta e risco:
fonte