Com GNU find:
find . -name foo.mp4 -printf '%h\n'
Com outros find s, desde que os nomes dos diretórios não contenham caracteres de nova linha:
find . -name foo.mp4 | sed 's|/[^/]*$||'
Ou:
find . -name foo.mp4 -exec dirname {} \;
embora isso signifique executar um comando dirname por arquivo.
Se você precisar executar um comando nesse path , você pode fazer (sintaxe padrão):
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 {} +
Embora, nesse caso, você possa usar -execdir (uma extensão BSD também disponível no GNU find ), que chdir() s está no diretório do arquivo:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
No entanto, tenha em atenção que enquanto a implementação GNU de find irá expandir {} para ./filename aqui, os do BSD expandem para filename . Tudo bem aqui, pois o nome do arquivo é passado como argumento para uma opção e é sempre featured.mp4 , mas para outros usos você pode ter que considerar que o nome do arquivo pode começar com - ou + (e ser entendido como uma opção pelo comando) ou conter = (e ser entendido como uma atribuição de variável por awk, por exemplo), ou outros caracteres causando esse tipo de problema com perl -p/n (nem todos eles são fixados pelo prefixo find do GNU ./ , embora nesse caso), etc, o que você pode ter que levar em conta.