Estou tentando tar
compactar recursivamente todos os arquivos com .lammpstrj
extensão na árvore de diretórios, começando no diretório cujo caminho está armazenado na variável home
. home
contém o script contendo meus tar
comandos e 57 subdiretórios, cada um contendo um par de subsubdiretórios chamados Soft_Pushoff
e Equilibrium_NVT
. Cada diretório Soft_Pushoff
ou Equilibrium_NVT
contém um .lammpstrj
arquivo. O loop que estou usando para realizar esta tarefa é:
for index in $(seq 1 57)
do
cd $home/$index/Soft_Pushoff/
file=`find ./ -mindepth 1 -maxdepth 1 -name "*.lammpstrj" -print`
tar cvf - ./$file | gzip -9 - > $file.tar.gz
cd $home/$index/Equilibration_NVT/
file=`find ./ -mindepth 1 -maxdepth 1 -name "*.lammpstrj" -print`
tar cvf - ./$file | gzip -9 - > $file.tar.gz
done
À medida que varre um dos 57 subdiretórios de home
, esta seção do código geralmente imprime:
././equilibration_nvt.lammpstrj
././soft_pushoff.lammpstrj
para o terminal. No entanto, em 3 instâncias diferentes, isto é o que esta seção do código imprime:
././equilibration_nvt.lammpstrj
././soft_pushoff.lammpstrj
./
./time.txt
./soft_pushoff.restart.10000
./equilibration_nvt.lmp
./.tar.gz
tar: ./.tar.gz: file changed as we read it
./equilibration_nvt_pitzer.sh
./eps.txt
././soft_pushoff.lammpstrj
././equilibration_nvt.lammpstrj
Nenhum dos arquivos "sinalizados" tar
deve ser operado pelos tar
comandos que estou usando, então estou confuso sobre por que eles estão listados ao lado da mensagem de aviso tar: ./.tar.gz: file changed as we read it
? Além disso, nenhum desses arquivos está realmente mudando conforme tar
a operação nos .lammpstrj
arquivos. O que poderia explicar esta mensagem de aviso e, o mais importante, posso confiar que nenhum dos .lammpstrj.tar.gz
arquivos escritos pelos meus tar
comandos está corrompido, especialmente aqueles associados a esta mensagem de aviso?
Se isso for relevante, meu script está sendo executado em um servidor remoto. Os .lammpstrj
arquivos que estou tentando compactar têm até 15,2 Gb de tamanho. Demora cerca de 2,5 dias para que meu script seja executado neste servidor remoto.
Se
$file
estiver vazio, você acabará executandotar cvf - ./ | gzip -9 > .tar.gz
o que causará a mensagem de erro que está vendo; você está selecionando o diretório atual, que incluirá arquivos que você não espera e o.tar.gz
arquivo em si fará parte do arquivo.Ou você
find
não está fazendo o que espera ou precisa fazer uma verificação de segurança notar
por exemplo
Você está honestamente complicando as coisas - use seu shell para obter uma lista de arquivos correspondentes e analise-os. E vamos nos livrar de todas as coisas anacrônicas aí - a substituição de processos geralmente é feita usando
$(…)
em vez de
hoje em dia (mais seguro para escrever e aninhado!),…
seq begin end
é supérfluo quando você tem{begin..end}
, e qualquer umtar
que eu saiba foi capaz de aplicar gzip compressão em si desde... desde que uso computadores, eu acho. Portanto, todo o seu script se reduz a: (substituindogzip --best
porzstd -15
(15 é uma configuração de compactação muito alta para zstd) após nossa discussão acima, onde você disse que a taxa de compactação é importante para você)É claro que você obterá uma compactação melhor se compactar todos os arquivos em um arquivo, pois suspeito que haja partes deles semelhantes e, portanto, comprima muito bem se você colocá-los no mesmo arquivo. Também é ainda mais fácil; nenhum
for
loop necessário