İle GNU
find:
find . -name foo.mp4 -printf '%h\n'
Diğer find
s'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 dirname
dosya 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 find
genişleyecektir {}
için ./filename
buraya, BSD olanları genişletmek filename
. Dosya adı bir seçeneğe argüman olarak iletildiğinden ve her zaman her featured.mp4
durumda 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
%h
Dosya 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 "." .