Сценарий Bash - определить, был ли изменен файл? - PullRequest
9 голосов
/ 15 января 2011

У меня есть скрипт Bash, который несколько раз копирует файлы каждые 5 секунд.Но это излишнее касание, так как обычно изменений нет.

Я знаю о команде Linux watch, но этот сценарий будет использоваться на компьютерах с OS X (у которых нет watch, иЯ не хочу, чтобы все устанавливали macports) Мне нужно иметь возможность проверить, изменен ли файл с помощью прямого кода Bash.

Должен ли я проверять время изменения файла?Как я могу это сделать?

Редактировать: Я надеялся расширить свой сценарий, чтобы сделать больше, чем просто скопировать файл, если он обнаружил изменение.Так есть ли способ сделать это?

Ответы [ 4 ]

13 голосов
/ 15 января 2011

Я склонен согласиться с ответом rsync, если у вас большие деревья файлов управлять, но вы можете использовать флаг -u (--update) для cp, чтобы скопировать файл (ы) заканчиваются, только если источник новее, чем пункт назначения.

cp -u

Редактировать

Поскольку вы обновили вопрос, чтобы указать, что вы хотели бы принять некоторые дополнительные действия, вы захотите использовать проверку -nt во встроенной команде [ (test):

#!/bin/bash

if [ $1 -nt $2 ]; then
  echo "File 1 is newer than file 2"
else
  echo "File 1 is older than file 2"
fi

со страницы руководства:

file1 -nt file2
         True if file1 is newer (according  to  modification  date)  than
         file2, or if file1 exists and file2 does not.

Надеюсь, это поможет.

6 голосов
/ 15 января 2011

OS X имеет команду stat.Примерно так должно получиться время модификации файла:

stat -f '%m' filename

Эквивалент GNU будет:

stat --printf '%Y\n' filename
3 голосов
/ 15 января 2011

Может оказаться более надежным обнаруживать изменения в содержимом файла, сравнивая размер файла (если размеры различаются, содержимое имеет) и хеш содержимого. Вероятно, не имеет большого значения, какой хеш вы используете для этой цели: SHA1 или даже MD5, вероятно, достаточно, и вы можете обнаружить, что команды cksum достаточно.

Время изменения файла может меняться без изменения содержимого (подумайте touch file); Время изменения файла не может измениться, даже если содержимое меняется (делать это сложнее, но вы можете использовать touch -r ref-file file, чтобы установить времена изменения file, чтобы соответствовать ref-file после редактирования файла).

0 голосов
/ 15 января 2011

Нет. Вы должны использовать rsync или один из его внешних интерфейсов для копирования файлов, так как он обнаружит, что файлы отличаются, и скопирует их, только если они есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...