Как сделать так, чтобы переменная счетчика была уникальной для каждой строки файла

Итак, у меня есть 2 каталога с одинаковыми файлами, за исключением того, что каталог a - это сегодняшние данные, а каталог b - вчерашние данные. Я хочу сравнить файлы и вывести результаты в 3 столбца, которые будут именем файла, идентичны ли файлы или нет, и сколько дней файлы были одинаковыми.

Вот что у меня есть:

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"

По сути, все работает, кроме счетчика. Мне нужно, чтобы счетчик был уникальным для каждого сравниваемого имени файла, а затем обновлялся каждый раз при запуске скрипта (один раз в день), но я не смог понять, как это сделать.

0
10.01.2017, 22:30
3 ответа

Судя по комментариям к другому моему ответу и вашему вопросу, похоже, что вы действительно ищете способ отслеживать изменения в наборе файлы. Это обычно известно как контроль версий (или ревизий). Один из распространенных движков для этого, который обычно устанавливается в системе, - это git .

Чтобы реализовать это, выберите место для хранения того, что мы назовем «репозиторием», в котором будут храниться копии файлов и отслеживаться все изменения в них.Мы назовем это место / путь / к / репозиторию . Создайте этот каталог и выполните команду git init . Это настроит репозиторий. Скопируйте файлы в каталог, и теперь мы «зафиксируем» текущее состояние в репозитории:

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

Затем вы можете просто наблюдать за местом доставки и обновлять репозиторий по мере необходимости:

#!/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)"

Это быстрый и - грязный скрипт, который не обрабатывает файлы с пробелами в их именах или файлы, добавляемые или удаляемые из ленты, особенно хорошо, но это место для начала.

0
28.01.2020, 04:48

Если вы хотите, чтобы он сохранял состояние при нескольких запусках скрипта, вам нужно будет перетащить файл на диск или другой энергонезависимый носитель, который ваш сценарий будет читать при запуске для инициализации и записывать при выходе для дальнейшего использования:

#!/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))
0
28.01.2020, 04:48

Я бы установил систему контроля версий. Например, используя mercurial, hg init в каталоге, где хранятся файлы. Затем один раз в день (вероятно, как задание cron сразу после размещения туда новых файлов), hg addremove и hg commit .

Затем, чтобы запустить отчет, вы можете перебрать каждый файл ( для имени файла в dropzone / *; do ) и получить метку времени, с которой он был последний раз зафиксирован, например hg log -l 1 --template "{date (date, '% s')} \ n" "$ filename" . % s предоставит вам временную метку в секундах UNIX; вы можете получить текущее значение с помощью $ (date +% s) , вычесть и приблизительно преобразовать это значение в дни.

Любая VCS ( svn , git и т. Д.) Будет работать для вас точно так же, поэтому просто используйте то, что вам удобно.

0
28.01.2020, 04:48

Теги

Похожие вопросы