Con GNUtrovare:
find . -name foo.mp4 -printf '%h\n'
Con altri messaggi find, i nomi delle directory forniti non contengono caratteri di nuova riga:
find . -name foo.mp4 | sed 's|/[^/]*$||'
O:
find . -name foo.mp4 -exec dirname {} \;
sebbene ciò significhi eseguire un dirnamecomando per file.
Se è necessario eseguire un comando su questo path, è possibile eseguire (sintassi standard):
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 {} +
Sebbene in questo caso, potresti essere in grado di usare -execdir(un'estensione BSD disponibile anche in GNU find), che chdir()è nella directory del file:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
Attenzione però che, mentre l'implementazione GNU di findsi espanderà {}a ./filenamequi, quelli BSD si espandono a filename. Va bene qui poiché il nome del file viene passato come argomento a un'opzione ed è sempre featured.mp4comunque, ma per altri usi potresti dover tenere conto del fatto che il nome del file può iniziare con -o +(ed essere compreso come un'opzione dal comando) o contenere =(ed essere intesi come un'assegnazione variabile da awk per esempio), o altri caratteri causano questo tipo di problemaperl -p/n (non tutti fissati dal GNU find's ./prefisso se in quel caso), ecc, che potrebbe essere necessario prendere in considerazione .
-printf%hdirectory principali del nome del file (tutte tranne l'ultimo elemento). Se il nome del file non contiene barre (poiché si trova nella directory corrente), l'identificatore% h si espande in "." .