Estoy intentando escribir un script que se ejecutará en un directorio dado con muchos subdirectorios de un solo nivel. El script creará un cd en cada uno de los subdirectorios, ejecutará un comando en los archivos del directorio y saldrá para continuar en el siguiente directorio. ¿Cuál es la mejor manera de hacer esto?
shell-script
Algo Jones
fuente
fuente
youtube-dl
.Respuestas:
fuente
for d in ./*/
inicia un ciclo que almacena cada elemento en./*/
(una lista de archivos / carpetas, en este caso) en una variable$d
.do (cd "$d" && somecommand);
comienza el cuerpo del bucle. Dentro del cuerpo, inicia una subshell y ejecuta los comandoscd
ysomecommand
. Como es un shell hijo, el shell padre (el shell desde el que está ejecutando este comando) retiene su CWD y otras variables de entorno.done
simplemente cierra el cuerpo del bucle.for d in ./*/ ; do (cd "$d" && ls); done
no funcionará. Pero,for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); done
funcionará. -utilizando ls como el comando en este ejemplo.-bash: cd: ./*/: No such file or directory
La mejor manera es no usar
cd
en absoluto:execdir
es comoexec
, pero el directorio de trabajo es diferente:No es POSIX.
fuente
find
ejecuta esos comandos, por lo que no sería consciente de los alias. ¿Qué esmd
y es.link
un directorio?bash
:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;
No tiene que vercat
conwget
, que tiene una-i
bandera para leer en una URL de un archivo. Además, esto es algo diferente de su pregunta original (ya que parece estar interesado solo en los archivos nombrados.link
y no en otros archivos que puedan estar presentes).El comando anterior no necesita hacer subcapas: solo realiza un seguimiento de su progreso en el shell actual alternando
$OLDPWD
y$PWD
. Cuandocd -
el shell intercambia el valor de estas dos variables, básicamente, ya que cambia los directorios. También imprime el nombre de cada directorio, ya que funciona allí para stderr.Acabo de echarle un segundo vistazo y decidí que podría hacer un mejor trabajo con el manejo de errores. Saltará un directorio en el que no puede
cd
, ecd
imprimirá un mensaje sobre por qué stderr, y contarábreak
con un código de salida distinto de cero si sucommand
ejecución no es exitosa o si la ejecucióncommand
afecta de alguna manera su capacidad de regresar a su directorio original -$OLDPWD
. En ese caso, también hace uncd -
último, y escribe el nombre del directorio de trabajo actual resultante en stderr.fuente
fuente