Usando 'ls' recursivamente sem -R

0

Estou tentando escrever um script de shell com saída semelhante a ls -R sem usar a opção -R .

Isso faz parte de uma atribuição de programação que me impede de usar -R , find e du . Eu preciso identificar os 5 principais arquivos / diretórios dentro do meu diretório home inteiro e dizer quantos diretórios e arquivos existem no total.

Eu entendo que posso usar {sort -n | tail -n} para obter os 5 principais arquivos, mas não posso descobrir como obter uma lista não filtrada de todos os arquivos e diretórios de forma recursiva sem usar a opção -R .

    
por Joshua Twaites 12.11.2013 / 00:24

2 respostas

1

Parece que você está sendo solicitado a escrever um script recursivo em vez de confiar em um comando que faz a recursão para você.

Aqui está o esqueleto de tal função. Deixei algumas das partes em branco para você preencher.

listAllFiles() {
    local dir=$1
    local file

    for file in "$dir"/*; do
        if <$file is a directory>; then
            listAllFiles "$file"
        else
            <print $file>
        fi
    done
}

Em um nível alto, essa função usa um diretório como seu primeiro argumento. Faz um loop sobre o conteúdo desse diretório. Se encontrar um subdiretório, ele chama a si mesmo. Caso contrário, imprime o que encontrou. Isso acabará recorrendo a uma estrutura de diretórios.

Você pode usar essa função da mesma forma que usaria um comando interno como ls -R ou find . Você pode armazenar os resultados em uma variável:

allFilesInCurrentDirectory=$(listAllFiles .)

Ou você pode usá-lo em um pipeline:

listAllFiles ~/ | cmd1 | cmd2
    
por 12.11.2013 / 01:17
0

Você não especificou o bash explicitamente, então estou aproveitando a liberdade para oferecer uma solução muito simples para o zsh:

ls -d ~/**/*| egrep -v "/.*/.*/.*/"

Se você deseja incluir arquivos de ponto também:

ls -d ~/**/*(D)| egrep -v "/.*/.*/.*/"

Estes só assumem que você não tem zilhões de arquivos em sua casa! Se você fizer isso, você receberá uma lista de argumentos de erro muito longo. Mas você pode encontrar erros semelhantes com qualquer solução que dê uma resposta em uma única etapa. (Chamadas de função recursiva também).

    
por 13.11.2013 / 18:42