#!/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 (usandolocal
en Bash,aparentementetypeset
en 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 conhi "$name"
. - Podemos rechazar
awk
y 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).