Explicando um script de shell para imprimir recursivamente a árvore de diretórios completa

5

Eu encontrei um script para imprimir recursivamente uma árvore de diretórios completa, mas não consigo entendê-lo. Alguém pode descrevê-lo totalmente? Acabei de começar o shell script. Aqui está o código:

#!/bin/bash
walk() {
        local indent="${2:-0}"
        printf "%*s%s\n" $indent '' ""
        for entry in ""/*; do
                [[ -d "$entry" ]] && walk "$entry" $((indent+4))
        done
}
walk ""
    
por Abhishek 05.10.2017 / 11:46

1 resposta

7

Este script define uma função walk() e, em seguida, executa walk no primeiro argumento passado para o script.

A função define primeiro uma variável local (uma conhecida apenas pela função e seus filhos) indent

indent é definido localmente como "${2:-0}" . Isto significa que se (o segundo argumento recebido pelo comando walk ) não estiver definido, então faça 0 . Esta variável é local para que você não possa passar um segundo argumento para o script.

A função então imprime o conteúdo do diretório especificado na linha de comando ( ) neste formato

printf "%*s%s\n" $indent '' ""

Isso significa que imprima $indent number of spaces e, em seguida, imprima o nome do diretório como uma string (portanto, um número não é esperado) e imprima uma nova linha.

Então a função executa um loop

for entry in /*; do

Isso designa todos os arquivos ou subdiretórios não ocultos em (o diretório especificado como o primeiro argumento para walk ) para a variável entry e faz um loop sobre eles, executando este comando neles:

[[ -d "$entry" ]] && walk "$entry" $((indent+4))

Isso significa que, se entry for um diretório, execute walk on entry . Agora walk tem um segundo argumento $((indent+4)) , que será usado em vez de 0 como o novo valor de indent . O efeito disso é que o diretório de primeiro nível não é recuado, mas os diretórios de segundo nível são recuados 4 espaços, os espaços de terceiro nível 8, etc. Como entry é agora o primeiro argumento, do walk função, ele irá recurse em toda a estrutura.

O script termina executando a função walk no parâmetro posicional , o primeiro argumento passado para o script. Uso poderia ser

./script directory

Isso significa que directory é e walk será executado em directory .

Seria bom se o script imprimisse arquivos regulares, mas eles pareceriam confusos sem alguma formatação elaborada. Eu recomendo usar tree para essa finalidade em vez do script!

    
por Zanna 05.10.2017 / 12:48