İle GNUfind:
find . -name foo.mp4 -printf '%h\n'
Diğer finds'lerde, sağlanan dizin adları yeni satır karakterleri içermez:
find . -name foo.mp4 | sed 's|/[^/]*$||'
Veya:
find . -name foo.mp4 -exec dirname {} \;
ancak bu dirnamedosya başına bir komut çalıştırmak anlamına gelir .
Bunun için bir komut çalıştırmanız gerekiyorsa path, yapabilirsiniz (standart sözdizimi):
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 {} +
Bu durumda, dosyanın dizininde bulunan -execdir(GNU'da da bulunan bir BSD uzantısı find) chdir()kullanabilirsiniz:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
GNU uygulanması sırasında bu olsa sakının findgenişleyecektir {}için ./filenameburaya, BSD olanları genişletmek filename. Dosya adı bir seçeneğe argüman olarak iletildiğinden ve her zaman her featured.mp4durumda olduğu için sorun yok, ancak diğer kullanımlar için dosya adının başlayabileceğini -veya +(ve komut tarafından bir seçenek olarak anlaşılabileceğini) veya içerdiğini dikkate almanız gerekebilir. =(ve örneğin awk değişken ataması olarak anlaşılacaktır) veya diğer karakterler neden olan bu tür bir sorunuperl -p/n GNU'den bunların hepsi sabit ( find's./ önek olsa bu durumda) dikkate almak gerekebilir vb, .
-printf%hDosya adının önde gelen dizinleri (son öğe hariç tümü). Dosya adı eğik çizgi içermiyorsa (geçerli dizinde olduğundan)% h belirteci "." .