Observo algumas coisas na sua função:
- Você se transforma em um diretório e, em seguida, percorre os arquivos e os dois novamente (
cd; for d in *; do cd; for d in * ...
). Isso parece que iria pular todos os outros níveis da árvore de diretórios durante uma caminhada recursiva. Uma iteração sobre os arquivos deve ser suficiente - Eu não acho que você precise usar um subshell quando chamar recursivamente a função (há a substituição do comando de backtick em
'checking() $d'
). Isso poderia ser útil se você precisasse de variáveis locais para cada instância da chamada de função, mas muitas shells podem fazer isso diretamente (usandolocal
no Bash, aparentementetypeset
in ksh93 ) - E, claro, a sintaxe para chamar uma função: dado
hi() { echo "hello $1"; }
, executamos como qualquer outro comando, simplesmente comhi "$name"
. - Podemos anular o
awk
e usar a expansão de parâmetro do shell para escolher a extensão do arquivo. (mas verifique o caso limite quando não houver ponto no nome do arquivo). Ou usecase "$f" in *.bin) ...
Aqui está uma função bastante simples para percorrer uma árvore de diretórios:
#!/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 .
(Embora a estrutura cd "$dir"; ... ; cd ..
possa causar problemas se alguém mover um diretório no momento em que o programa estiver processando esse diretório. O link ..
será alterado e o retorno por ele continuará do novo local, que pode até estar fora da árvore original. Poderíamos trabalhar em torno disso usando nomes absolutos de caminho o tempo todo, ou com pushd/popd
(no Bash), ou colocando toda a função ou chamadas para ele em subshells.)