Итак, у меня есть 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"
По сути, все работает, кроме счетчика. Мне нужно, чтобы счетчик был уникальным для каждого сравниваемого имени файла, а затем обновлялся каждый раз при запуске скрипта (один раз в день), но я не смог понять, как это сделать.
Судя по комментариям к другому моему ответу и вашему вопросу, похоже, что вы действительно ищете способ отслеживать изменения в наборе файлы. Это обычно известно как контроль версий (или ревизий). Один из распространенных движков для этого, который обычно устанавливается в системе, - это 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)"
Это быстрый и - грязный скрипт, который не обрабатывает файлы с пробелами в их именах или файлы, добавляемые или удаляемые из ленты, особенно хорошо, но это место для начала.
Если вы хотите, чтобы он сохранял состояние при нескольких запусках скрипта, вам нужно будет перетащить файл на диск или другой энергонезависимый носитель, который ваш сценарий будет читать при запуске для инициализации и записывать при выходе для дальнейшего использования:
#!/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))
Я бы установил систему контроля версий. Например, используя 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
и т. Д.) Будет работать для вас точно так же, поэтому просто используйте то, что вам удобно.