Это может быть удивительно, но -exec может использоваться в качестве теста при вызове find :
find -type f -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Приведенная выше команда перейдет в подкаталоги. Для поиска в текущем каталоге используйте только -maxdepth 1 , то есть:
find -maxdepth 1 -type f -exec …
Обратите внимание, что ffprobe проверит все файлы. Очевидно, что это не удастся для не-медиа файлов, но вы можете получить не видео (например, .jpg) в конечном выводе. Чтобы избежать этого, некоторые дополнительные тесты в find должны использоваться перед -exec , например:
find -maxdepth 1 -type f \( -iname "*.avi" -o -iname "*.mp4" -o -iname "*.mkv" \) -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Или лучше вы можете проверить MIME-тип с file:
find -maxdepth 1 -exec sh -c 'file --mime-type "$1" | grep -q "video/"' sh {} \; -exec sh -c 'ffprobe -show_streams 2>/dev/null "$1" | grep -q coded_height=720' sh {} \; -print
Читайте man find чтобы узнать больше.
РЕДАКТИРОВАТЬ:
Эта команда (mis) использует avconv , как вы и просили:
find -exec sh -c 'file --mime-type "$1" | grep -q "video/"' sh {} \; -exec sh -c 'avconv 2>&1 -i "$1" | grep -q "Stream.*x720"' sh {} \; -print
Проблема в том, что каждый вызов avconv вызывает ошибку. Мы просто игнорируем это и извлекаем необходимую нам информацию. Это несколько уродливое решение. Я не совсем уверен, что ваш avconv ведет себя как мой, возможно, вам придется заменить Stream.*x720 другим регулярным выражением.
что не так в моей комбинированной командной строке?
find -exec требует закрытия с \; или + ,
$( без ) после того, как вы отредактировали вопрос, есть "" чередующиеся (не вложенные) с $() ,
*720* может вызвать сглаживание оболочки, должно быть "*720*" (я говорю о sh , а не о внешней оболочке),
- вывод
avconv вы пытаетесь проанализировать, идет в stderr , я думаю, вам нужно перенаправить его, прежде чем вы сможете его проанализировать,
- и может быть что-то еще.