Con GNU
trovare:
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 dirname
comando 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 find
si espanderà {}
a ./filename
qui, quelli BSD si espandono a filename
. Va bene qui poiché il nome del file viene passato come argomento a un'opzione ed è sempre featured.mp4
comunque, 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
%h
directory 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 "." .