С GNUнаходкой:
find . -name foo.mp4 -printf '%h\n'
С другими finds предоставленные имена каталогов не содержат символов новой строки:
find . -name foo.mp4 | sed 's|/[^/]*$||'
Или:
find . -name foo.mp4 -exec dirname {} \;
хотя это означает запуск одной dirnameкоманды на файл.
Если вам нужно выполнить команду для этого path, вы можете сделать (стандартный синтаксис):
find . -name "featured.mp4" -exec sh -c '
for file do
dir=${file%/*}
ffmpeg -i "$file" -c:v libvpx -b:v 1M -c:a libvorbis "$dir" featured.webm
done' sh {} +
Хотя в этом случае вы можете использовать -execdir(расширение BSD также доступно в GNU find), которое chdir()находится в каталоге файла:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
Остерегайтесь, хотя, в то время как реализация GNU findрасширится {}до ./filenameздесь, BSD расширится до filename. Здесь все в порядке, поскольку имя файла передается в качестве аргумента опции и всегда в featured.mp4любом случае, но для других случаев вам может потребоваться принять во внимание, что имя файла может начинаться с -или +(и восприниматься командой как опция) или содержать =(и быть понятым как присвоение переменной, например, awk) или другими символами, вызывающими проблемы такого родаperl -p/n (не все из них исправлены префиксом GNU find, ./хотя в этом случае) и т. д., которые вы, возможно, должны принять во внимание ,
-printf%hведущие каталоги имени файла (все, кроме последнего элемента). Если имя файла не содержит косых черт (поскольку оно находится в текущем каталоге), спецификатор% h расширяется до «.» ,