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.