Если ваш bash не является палеолитическим, вы можете легко сделать это с помощью чистого bash:
shopt -s globstar
for f in bar/**/*; do
if [[ -f "$f" ]] && cmp -s foo "$f"; then
printf "The matched file is '%s'\n" "$f"
break
fi
done
Параметр globstar
, который позволяет использовать bar/**/*
для обозначения «всех файлов в дереве каталогов, озаглавленном bar
», был представлен в bash 4.0, выпущенном в 2009 году. (К сожалению, эта версия не установлена по умолчанию в OS X.)
break
в цикле - это оптимизация, которая останавливает поиск после того, как найден один файл, поскольку в описании проблемы четко указано «один из файлов». Если возможно несколько совпадений, и вам необходимо знать все из них, удалите break
.