Tengo una carpeta principal llamada "parent_folder" con muchas subcarpetas, en estas subcarpetas hay un archivo llamado "foo.mp4".
Puedo encontrar estos archivos fácilmente haciendo esto:
mymacbook:parent_folder username$ find ./ -name "foo.mp4" -exec echo {} \;
Ahora que devuelve la ruta de cada archivo, en relación con parent_folder /
./path/to/foo.mp4
¿Cómo puedo devolver solo la ruta, sin el nombre del archivo?
-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 "." .find ./ -name "foo.mp4" -printf "%h\n"
imprimirá la ruta para cada archivo encontrado (uno por línea). Más de lo habitual, nadie lo usa,-exec echo {}
por lo tanto, hay-print
(omisión incluso omitida) oprintf
acción.-printf
es solo GNU. El OP menciona OS / X (un sistema BSD).Respuestas:
Con
GNU
encontrar:Con otros
find
s, los nombres de directorio proporcionados no contienen caracteres de nueva línea:O:
aunque eso significa ejecutar un
dirname
comando por archivo.Si necesita ejecutar un comando sobre eso
path
, puede hacer (sintaxis estándar):Aunque en este caso, puede usar
-execdir
(una extensión BSD también disponible en GNUfind
), quechdir()
está en el directorio del archivo:Sin embargo,
find
tenga en cuenta que si bien la implementación de GNU se expandirá{}
hasta./filename
aquí, las de BSD tambiénfilename
. Está bien aquí, ya que el nombre de archivo se pasa como argumento a una opción y siempre es de todosfeatured.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 porfind
el./
prefijo de GNU en ese caso), etc., que puede tener que tener en cuenta .fuente
find .
, como dirname tendrás. en lugar de todo el camino.find ./ -name "featured.mp4" -exec ffmpeg -i "{}" -c:v libvpx -b:v 1M -c:a libvorbis [NEED DIRECTORY HERE] featured.webm \;
Estoy usando la segunda sugerencia que mencionaste.El siguiente comando también se puede utilizar para obtener solo los detalles del directorio.
fuente