Digamos que estoy en un directorio que tiene algunos subdirectorios, dir1
, dir2
, y dir3
. Cada uno de estos directorios tiene un archivo foo
y me gustaría ejecutar el mismo comando en cada foo
uno 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 . foo
es 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
find
soporte es compatible, use la-execdir
opción en lugar de-exec
Si 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
foo
archivos,La subshell evita
cd
que afecte al directorio de trabajo del resto del script. La${foo%/*}
sustitución de parámetros se expande al nombre del directorio dondefoo
vive el archivo (eliminando todo después del último/
en el valor de$foo
).Usando el estándar
find
para hacer lo mismo (en el caso de que losfoo
archivos 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