bash find: получить каталог найденного файла

У меня есть родительская папка с именем «parent_folder» с большим количеством подпапок, в этих подпапках есть файл с именем «foo.mp4».

Я могу легко найти эти файлы, выполнив следующие действия:

mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \; 

Теперь, когда возвращается путь к каждому файлу, относительно parent_folder /

 ./path/to/foo.mp4 

Как я могу вернуть только путь без имени файла?

С GNU найти:

  find . -name foo.mp4 -printf '%h\n' 

С другими find s, если имена каталогов не содержат символов новой строки:

  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() s в каталоге файла:

  find . -name "featured.mp4" -execdir \ ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;