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