Eu tenho a seguinte estrutura de diretório:
base/
files/
archives/
scripts/
Eu quero um script para executar scripts/
, compactar arquivos que correspondem results.*.log
em files/
um arquivo tar compactado em archives/
.
Estou tentando o seguinte comando:
tar czfC ../archives/archive.tar.gz ../files results.*.log
Mas eu entendo
tar: results.*.log: Cannot stat: No such file or directory
tar: Exiting with failure status due to previous errors
Enquanto
tar czfC ../archives/archive.tar.gz ../files results.a.log
funciona como esperado. Além disso
tar czf ../archives/archive.tar.gz ../files/results.*.log
funciona da maneira que eu gostaria, exceto que adiciona o prefixo files/
ao arquivo e também emite um aviso:
tar: Removing leading `../' from member names
Portanto, minha conclusão é que o tar
globbing não funciona corretamente ao usar a -C
opção. Algum conselho sobre como eu faço isso funcionar de uma maneira simples?
cd
aconteça.&&
é como;
ou nova linha, ele separa dois comandos. É como dizer que, após a execuçãocd
, qualquer glob expandiria arquivos no diretório anterior.Não há "piche de alcatrão", o globbing é feito pela concha. E o shell não tem idéia do que
tar -C somedir
fará seu trabalhosomedir
; quaisquer globs são expandidos no diretório atual.fonte
results.a.log
existe no diretório a partir do qual o script é executado, ele funciona. Mas não entendo por que isso acontece, pois-C
significa diretório de mudança, portanto, o diretório atual deve ser o únicoresults.a.log
. Não posso aceitar sua resposta porque você não oferece uma solução.tar
programa, que altera o diretório muito mais tarde. Não é possível "resolver" o seu problema, desculpe. A única saída é ir para o diretório em que você deseja enviar, ou fazer uma busca no diretório e salvar seus resultados em um arquivo ou variável.Você pode deixar
find
o globbing e omitir a opção 'change directory'tar
removendo ofiles/
prefixo antes de criar o tarfile.A
--no-recursion
opção paratar
é opcional, pois nenhum diretório será arquivado.fonte
Eu finalmente usei
fonte
A maneira de fazer isso é escrever algo como o seguinte:
fonte
Não é o alcatrão que faz o globbing, é a concha. Você está primeiro dizendo ao shell para fazer globbing, depois dizendo ao tar para alterar os diretórios. Como o tar está recebendo uma lista de nomes de arquivos em relação aos diretórios originais, isso não funciona.
A solução mais fácil, de longe, é permitir que o shell altere o diretório. Interativamente:
Em um script:
ou
fonte