Con GNU
encontrar:
find . -name foo.mp4 -printf '%h\n'
Con otros find
s, los nombres de directorio proporcionados no contienen caracteres de nueva línea:
find . -name foo.mp4 | sed 's|/[^/]*$||'
O:
find . -name foo.mp4 -exec dirname {} \;
aunque eso significa ejecutar un dirname
comando por archivo.
Si necesita ejecutar un comando sobre eso path
, puede hacer (sintaxis estándar):
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 {} +
Aunque en este caso, puede usar -execdir
(una extensión BSD también disponible en GNU find
), que chdir()
está en el directorio del archivo:
find . -name "featured.mp4" -execdir \
ffmpeg -i {} -c:v libvpx -b:v 1M -c:a libvorbis . featured.webm \;
Sin embargo, find
tenga en cuenta que si bien la implementación de GNU se expandirá {}
hasta ./filename
aquí, las de BSD también filename
. Está bien aquí, ya que el nombre de archivo se pasa como argumento a una opción y siempre es de todos featured.mp4
modos, pero para otros usos, es posible que tenga que tener en cuenta que el nombre del archivo puede comenzar con -
o +
(y el comando lo puede entender como una opción) o contener =
(y debe entenderse como una asignación variable por awk por ejemplo), u otros caracteres que causan este tipo de problema conperl -p/n
(no todos ellos arreglados por find
el ./
prefijo de GNU en ese caso), etc., que puede tener que tener en cuenta .
-printf
%h
directorios principales del nombre del archivo (todos menos el último elemento). Si el nombre del archivo no contiene barras (ya que está en el directorio actual), el especificador% h se expande a "." .