Contar o número de linhas em cada arquivo dentro do diretório atual usando um loop for?

0
  • Se um parâmetro for fornecido como uma entrada, o script deverá verificar apenas o número de linhas desse arquivo de entrada, caso contrário, o script deverá exibir o número de linhas para cada arquivo dentro desse diretório.
  • O arquivo de script deve ser ignorado, ou seja, a contagem do arquivo de script não deve ser exibida.

Eu tentei:

#!/bin/bash
if [ $# -eq 0 ]
then
        for l in *.txt
        do
                echo $(wc -l $l)
        done
else
        for l in $*
        do
                echo $(wc -l $l)
        done
fi

Mas eu não tenho permissão para mencionar explicitamente o tipo de arquivo, ou seja, * .txt - ele deve verificar todos os arquivos, exceto o arquivo de script.

    
por Koshur 10.01.2017 / 11:18

3 respostas

2

Eu acho que você quase conseguiu. Você pode usar basename "$0" para find o nome do script de dentro do script e imprime a contagem de linhas de tudo, exceto que

#!/bin/bash
if [ $# -eq 0 ]
then
    for k in *
    do
        if [[ ! -d "$k" && "$k" != 'basename "$0"' ]]
        then
            wc -l "$k"
        fi
    done
else
    for k in $*
    do
         wc -l "$k"
    done
fi

Tomei a liberdade de

  • Usando k em vez de l (não recomendado para nomes de variáveis, tenho certeza, embora não consiga encontrar um link (pode ser confundido com 1 , I ))
  • Usando 4 espaços para recuo em vez de 8. No final, isso é obviamente sua decisão, mas eu diria que 4 são mais legíveis que 8.
  • Citando suas variáveis. Altamente recomendado para evitar a divisão de nomes de variáveis com espaços.
  • Descartando o echo desnecessário como @Serg apontou.

EDIT Eu adicionei colchetes duplos e um teste para diretórios para ignorá-los também para o if condicional.

    
por 10.01.2017 / 11:40
0
#!/bin/bash

if [[ "$#" != 0 ]]; then
  # only process the names given to us
  wc -l "$@"
  exit
fi

# process all regular files in this directory, avoiding this script
for f in ./*; do
    if [[ "$f" != "$0" ]] && [[ -f "$f" ]]; then
        wc -l "$f"
    fi
done
    
por 10.01.2017 / 11:50
0

Em vez de um script, você também pode combinar três (3) comandos em uma linha e imprimir os resultados desejados.
Por exemplo.

find . -maxdepth 1 -type f -name "*.txt" -exec cat {} + | wc -l

Se você não quiser pesquisar apenas no diretório atual, mas também contar as linhas recursivamente, poderá remover a opção "-maxdepth 1" ou alterar o número com base nas suas necessidades.

    
por 10.01.2017 / 17:08

Tags