Como obtenho uma variável de contador para ser única para cada linha de um arquivo

0

Então, o que eu tenho são dois diretórios que têm os mesmos arquivos, exceto que o diretório a é os dados de hoje e o diretório b é os dados de ontem. O que eu quero fazer é comparar os arquivos e gerar os resultados em 3 colunas, que será o nome do arquivo, se os arquivos são idênticos e quantos dias os arquivos foram iguais.

O que eu tenho até agora é:

ls ./dropzone_current > files.txt

is_identical=false


filename="files.txt"
while read -r line
do
    name="$line"
    declare -i counter 
    diff -qs ./dropzone_current/$name ./dropzone_backup/$name
    if [ $? -ne 0 ]
    then
    is_identical=false
    counter=0
    printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt

    else
    counter=$((counter + 1))
    is_identical=true
    printf '%s\t%s\t%s\n' "$name" "$is_identical" "$counter" >> test.txt
    fi


done < "$filename"

Essencialmente, tudo funciona, exceto o contador. Eu preciso que o contador seja exclusivo para cada nome de arquivo que está sendo comparado e, em seguida, atualize toda vez que o script for executado (uma vez por dia), mas não consegui descobrir como fazer isso.

    
por Andrew Kimbel 10.01.2017 / 21:30

3 respostas

0

Com base nos comentários da minha outra resposta e da sua pergunta, parece que o que você realmente está procurando é uma maneira de rastrear alterações em um conjunto de arquivos. Isso é comumente conhecido como controle de versão (ou revisão). Um mecanismo comum para isso que geralmente é instalado em um sistema é git .

Para implementar isso, escolha um local para armazenar o que chamaremos de 'repositório', que armazenará uma cópia dos arquivos e rastreará todas as alterações feitas nela. Chamaremos esse local de /path/to/repository . Crie esse diretório e execute o comando git init . Isso irá configurar o repositório. Copie os arquivos para o diretório e agora vamos "confirmar" o estado atual no repositório:

git add *
git commit -m "Initial commit of files"

Em seguida, você pode simplesmente assistir ao local de entrega e atualizar o repositório conforme necessário:

#!/bin/bash
repo='/path/to/repository'
dropbox='/path/to/delivery/'

cd $repo
for file in *; do
    if ! diff "${repo}/$file" "${dropbox}/$file"; then
        cp -p "${dropbox}/$file" ${repo}/
        git add "$file"
    fi
done
git commit -m "Update for $(date)"

Este é um script rápido e sujo que não manipula arquivos com espaços em seus nomes, ou arquivos sendo adicionados ou removidos do feed particularmente bem, mas é um lugar para começar.

    
por 10.01.2017 / 21:51
0

Se você quiser manter o estado em várias execuções do script, precisará soltar um arquivo no disco ou outro meio não volátil que o script lerá na inicialização para a inicialização e escreva na saída para referência futura:

#!/bin/bash
dropfile='/path/to/your/counterfile'
if [[ -r "$dropfile" ]]; then
    counter=$(cat "$dropfile" )
else
    counter=0
fi
trap 'echo $counter > "$dropfile"' EXIT

echo "This script has run $counter times."
counter=$((counter+1))
    
por 10.01.2017 / 21:36
0

Eu configuraria um sistema de controle de revisão. Por exemplo, usando o mercurial, hg init no diretório em que os arquivos estão armazenados. Então, uma vez por dia (provavelmente como um trabalho cron logo após os novos arquivos serem colocados lá), hg addremove e hg commit .

Em seguida, para executar seu relatório, você pode fazer um loop por cada arquivo ( for filename in dropzone/*; do ) e obter o registro de data e hora em que ele foi confirmado pela última vez, por exemplo, %código%. O hg log -l 1 --template "{date(date, '%s')}\n" "$filename" lhe dará o registro de data e hora de segundos do UNIX; você pode obter o valor atual com %s , subtrair e converter isso, aproximadamente, em dias.

Qualquer VCS ( $(date +%s) , svn , etc.) funcionará tão bem para você, então use o que você estiver confortável.

    
por 10.01.2017 / 21:49

Tags