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

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

Модератор: /dev/random

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

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

Сообщение Stauffenberg » 06.06.2014 12:18

Всем привет.

Вот такая задачка: есть, скажем, 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
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit » 06.06.2014 13:38

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

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

?
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
Сообщения: 2022
Статус: ☮ PEACE ☮
ОС: открытая и свободная

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

Сообщение Stauffenberg » 06.06.2014 14:06

Да. либо так, либо так: имя_файла --> сервер, на котором самый свежий/новый файл.
Если серверов несколько, то показываем естественно любой 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
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit » 06.06.2014 14:52

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

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
Сообщения: 2022
Статус: ☮ PEACE ☮
ОС: открытая и свободная

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

Сообщение Stauffenberg » 06.06.2014 15:52

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
Модератор
Сообщения: 4666
Статус: фанат консоли (=
ОС: GNU/Debian, RHEL

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

Сообщение SLEDopit » 06.06.2014 16:18

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
Сообщения: 2022
Статус: ☮ PEACE ☮
ОС: открытая и свободная

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

Сообщение Stauffenberg » 06.06.2014 16:32

Я уже дополнил скрипт всем, что мне надо. У меня была проблема со списком всех файлов на всех серверах. Похоже. что проблема решена ;)
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)
Спасибо сказали: