З 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 \;
Остерігайтеся , однак , що в той час як реалізація ГНУ findбуде розширюватися , {}щоб ./filenameтут, BSD з них розширюватися filename. Це нормально тут , як ім'я файлу передається в якості аргументу опції і завжди в featured.mp4будь-якому випадку, але і для інших використань ви , можливо , доведеться взяти до уваги , що ім'я файлу може починатися з -або +(і слід розуміти в якості опції по команді) або містити =(і розуміється як присвоєння змінної, наприклад, awk), або інші символи, що викликають подібні проблемиperl -p/n (не всі вони виправлені префіксом GNU find, ./хоча в цьому випадку) тощо, тощо, які, можливо, доведеться враховувати. .
-printf%hпровідні каталоги імені файлу (усі, крім останнього елемента). Якщо ім'я файлу не містить косої риски (оскільки він знаходиться в поточній директорії), специфікатор% h розширюється на ". .