Digamos que estoy en un directorio que tiene algunos subdirectorios, dir1, dir2, y dir3. Cada uno de estos directorios tiene un archivo fooy me gustaría ejecutar el mismo comando en cada foouno de los directorios y ejecutar ese comando desde ese directorio.
Si lo hiciera "a mano", se vería así:
cd dir1
(execute on foo)
cd ../dir2
(execute on foo)
cd ../dir3
(execute on foo)
Es imperativo que el comando se ejecute desde cada uno de los directorios . fooes un script de programación por lotes (para HTCondor, si le interesa saber) y debe ejecutarse desde cada subdirectorio para que la salida de las ejecuciones iniciadas por los scripts de programación termine en cada subdirectorio.
La pregunta " Buscar un archivo y ejecutar un comando en el directorio del archivo ", por lo que puedo decir, no responde a mi pregunta. La primera respuesta a esa pregunta es más una solución alternativa que no funcionará en mi caso, y la segunda respuesta no tiene una explicación suficiente para que yo sepa cómo usarla.

Respuestas:
Suponiendo que su
findsoporte es compatible, use la-execdiropción en lugar de-execSi no es así, proporcione detalles de su plataforma y / o distribución (según corresponda).
fuente
{}, sino el padre de{}.-exec, pero el comando especificado se ejecuta desde el subdirectorio que contiene el archivo coincidente ".Suponiendo que sepa exactamente en qué directorios ejecutar su comando,
o, recorriendo los
fooarchivos,La subshell evita
cdque afecte al directorio de trabajo del resto del script. La${foo%/*}sustitución de parámetros se expande al nombre del directorio dondefoovive el archivo (eliminando todo después del último/en el valor de$foo).Usando el estándar
findpara hacer lo mismo (en el caso de que losfooarchivos puedan vivir en el fondo de una estructura de directorios):En palabras: encuentre todos los archivos regulares llamados "foo" en cualquier lugar del directorio actual o debajo y asigne sus nombres de ruta a este script de shell en lotes. El script de shell iterará sobre los nombres de ruta dados, cambiará el directorio a la parte del directorio de cada nombre de ruta y, si eso tiene éxito, se ejecutará
somecommand foo.Para una solución que usa el no estándar
-execdir, vea la respuesta de roaima . Su respuesta se adaptó a mi ejemplo:fuente