С 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()
находится в каталоге файла:
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 расширяется до «.» ,