Поскольку вы используете тест, чтобы избежать создания записи каталога с уже существующим именем, не имеет значения, что это за запись (обычный файл, каталог, FIFO, узел устройства или другое )только то, что она уже существует и не может быть создан (, так как имя уже используется ).
Тест -f
обнаруживает только «обычные файлы». -e
обнаруживают некоторые другие типы.
Это ближе к вашим намерениям:
[ -e "$output_filename" ] &&
print_error_and_exit 6 "Destination file name exists."
Однако -e
не обнаруживает ссылки. Вам нужно использовать эту конструкцию:
[ -e "$output_filename" ] || [ -L "$output_filename" ] &&
print_error_and_exit 6 "Destination file name exists."
cron
не имеет логики относительно того, как выполняется задача.
Он просто запускает команду в указанный вами момент.
Для такого рода интеллекта вы должны реализовать его в своем скрипте.
Другим способом управления может быть использованиеlogrotate
(чередования файлов журналов при некоторых условиях )илиincron
(cron
-таких как служба, где триггерами являютсяinotify
события, а не время ).
Вам нужно где-то сохранить старый хэш, а затем сравнить его с новым. Что-то в этом направлении:
#!/bin/sh
file=/path/to/file
hashfile=/path/to/stored/hash
newhash=$(md5sum "$file")
oldhash=$(cat "$hashfile")
if [ "$newhash" != "$oldhash" ]; then
echo it changed...
fi
echo "$newhash" > "$hashfile"