Cómo crear una llamada de función recursiva en Unix

Cómo crear una llamada de función recursiva en Unix
#!/bin/sh
checking()
{
  cd "$1"
  for D in *;do
    if [ -d "$D" ]; then
      cd "$D"
      for d in *;do
        echo "$d"
        if [ -d "$d" ]
        then
           `checking() $d`
        fi
        if [ -f "$d" ]
        then
                file_name=`echo "$d" | cut -d'.' -f1`
                echo $file_name
                file_ext=$(echo $d |awk -F . '{if (NF>1) {print $NF}}')
                echo $file_ext
                if [ $file_ext = bin ]
                then
                        strings $d > $file_name.txt
                        mv $file_name.txt /somepath
                fi
        fi

      done
      cd ..

    fi
  done
}

a=$(pwd)
checking() $a

Estoy convirtiendo archivos binarios de registro de sesión en archivos de texto y almacenándolos en alguna ruta usando la función de cadenas. Para cada directorio, funciona bien, pero no verifica los archivos binarios en busca de ningún subdirectorio presente.

Intenté usar una llamada de función recursiva pero esa llamada no se activa. Por favor, ayuda

Respuesta1

Noto un par de cosas en su función:

  • Cambia a un directorio, luego itera sobre los archivos y luego hace ambas cosasde nuevo( cd; for d in *; do cd; for d in * ...). Parece que se saltaría cualquier otro nivel del árbol de directorios durante un recorrido recursivo. Una iteración sobre los archivos debería ser suficiente.
  • No creo que necesites usar una subcapa cuando llamas recursivamente a la función (existe la sustitución del comando de acento grave en `checking() $d`). Eso podría ser útil si necesita variables locales para cada instancia de la llamada a la función, pero muchos shells pueden hacerlo directamente (usando localen Bash,aparentemente typeseten ksh93)
  • Y por supuesto la sintaxis para llamar a una función: dado que hi() { echo "hello $1"; }la ejecutamos como cualquier otro comando, simplemente con hi "$name".
  • Podemos rechazar awky usar el shell.expansión de parámetrospara elegir la extensión del archivo. (pero verifique el caso límite cuando no hay ningún punto en el nombre del archivo). O usecase "$f" in *.bin) ...

Aquí hay una función bastante simple para recorrer un árbol de directorios:

#!/bin/sh

walk() {
        cd "$1"
        for f in *; do 
                if [ -d "$f" ] ; then
                        echo descending into "$f"...
                        walk "$f"
                else
                        ext=${f##*.}
                        if [ "$ext" = "bin" ] ; then
                                echo "found .bin file: $f"
                        fi
                fi

        done
        cd ..
}

walk .

(Aunque tenga en cuenta que la cd "$dir"; ... ; cd ..estructura puede causar problemas si alguien mueve un directorio justo en el momento en que el programa está procesando ese directorio. El ..enlace cambiaría y regresar a través de él continuaría desde la nueva ubicación, que incluso podría estar fuera del árbol original. Podríamos solucionar este problema usando nombres de ruta absolutos todo el tiempo, o con pushd/popd(en Bash), o poniendo toda la función o las llamadas a ella en subcapas).

información relacionada