найти файл, измененный последним (сравниваем файлы на разных машинах)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Ответить
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

найти файл, измененный последним

Сообщение Stauffenberg »

Всем привет.

Вот такая задачка: есть, скажем, 15 серверов, на каждом из которых есть каталог с файлами. Надо сравнить (через ssh, ключ на другие сервера добавлен) файлы в этом каталоге и показать на каком сервере лежит файл, изменения в котором самые свежие (был изменен последним).
Файлы на некоторых серверах могут отсутствовать, скрипт запинаться на должен.

python или bash.

Заранее спасибо за помошь.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: найти файл, измененный последним

Сообщение SLEDopit »

Я правильно понимаю, что фактически нужно составить примерно такой список:

сервер файл_с_самым_свежим_таймстампом

?
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: найти файл, измененный последним

Сообщение Stauffenberg »

Да. либо так, либо так: имя_файла --> сервер, на котором самый свежий/новый файл.
Если серверов несколько, то показываем естественно любой IP сервера.
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: найти файл, измененный последним

Сообщение SLEDopit »

Код: Выделить всё

for server in server{1..15} ; do ssh $server 'find /path/to/dir -printf "%p %T@ $HOSTNAME \n"' ; done | sort -k1,2 | awk '{if(k!=$1){k=$1;print;}}'

т.к. всё уже отсортировано, то можно обойтись без массива в awk.
если директории имеют разные пути, то нужно резать до одинакового основания. иначе получится каша.
если с переменной HOSTNAME будут проблемы, можно попробовать костыль | sed "s/$/ $server/" после ssh.
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: найти файл, измененный последним

Сообщение Stauffenberg »

SLEDopit

Большое спасибо! Это то, что нужно.
У меня только вопрос: сравнение по всем серверам идет со списком файлов, которые скрипт нашел на первом сервере из for-списка?
Будует ли добавлять скрипт новые файлы для сравнения, которые есть, скажем, только на 11 и 14 сервере?
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
SLEDopit
Модератор
Сообщения: 4823
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

Re: найти файл, измененный последним

Сообщение SLEDopit »

Stauffenberg писал(а):
06.06.2014 15:52
У меня только вопрос: сравнение по всем серверам идет со списком файлов, которые скрипт нашел на первом сервере из for-списка?
Нет. По сути составляется список всех файлов на всех серверах ( full_path_to_file unix_timestamp server_hostname ), затем сортируется по имени (-k1) и таймстампу (,2) и для каждого уникального имени берётся самый новый запись. Если файл есть только на одном из сервером, то только он и будет присутствовать.
Единственное, что я не очень учёл -- файлы могут быть с пробелами в имени. Тогда вся сортировка съедет. Лучше поставить имя файла в самый конец, так надёжнее ( тут правда ещё и awk часть тогда нужно доводить до ума, но я не знаю насколько это вообще актуально ).

Код: Выделить всё

for server in server{1..15} ; do ssh $server 'find /path/to/dir -printf "$HOSTNAME %T@ %p\n"' ; done | sort -k3,2 | awk '{if(k!=$3){k=$3;print;}}'
UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity. © Dennis Ritchie
The more you believe you don't do mistakes, the more bugs are in your code.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2042
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: найти файл, измененный последним

Сообщение Stauffenberg »

Я уже дополнил скрипт всем, что мне надо. У меня была проблема со списком всех файлов на всех серверах. Похоже. что проблема решена ;)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Ответить