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 comandoscdysomecommand. 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.donesimplemente cierra el cuerpo del bucle.for d in ./*/ ; do (cd "$d" && ls); doneno funcionará. Pero,for d in ./*/ ; do (cd "$d" && for d in ./*/ ; do (cd "$d" && ls); done ); donefuncionará. -utilizando ls como el comando en este ejemplo.-bash: cd: ./*/: No such file or directoryLa mejor manera es no usar
cden absoluto:execdires comoexec, pero el directorio de trabajo es diferente:No es POSIX.
fuente
findejecuta esos comandos, por lo que no sería consciente de los alias. ¿Qué esmdy es.linkun directorio?bash:find . -type f -iname '*.link' -execdir ${BASH_ALIASES[md]} -i {} \;No tiene que vercatconwget, que tiene una-ibandera 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.linky 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
$OLDPWDy$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, ecdimprimirá un mensaje sobre por qué stderr, y contarábreakcon un código de salida distinto de cero si sucommandejecución no es exitosa o si la ejecucióncommandafecta 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