Imprimir recursivamente o tamanho do arquivo

3

Como imprimir o tamanho de todos os arquivos * .txt em um diretório?

Por exemplo: conteúdo do diretório:

FileA.txt 
FileB.txt
FileC.txt 
FileA.csv

* .txt length:

less FileA.txt | wc -l 
43
less FileB.txt | wc -l 
13
less FileC.txt | wc -l 
3

Saída desejada (gravação no arquivo de saída):

43
13
3

(Estou tentando, sem sucesso: ls *.txt| while read FN; do wc -l < $FN >> output; done - produz arquivo vazio)

    
por dovah 18.11.2015 / 11:50

3 respostas

4

Algumas alternativas:

Com o GNU sed :

sed -sn '$=' ./*.txt

(note que ele não informará o número de arquivos vazios e (ao contrário de wc -l ), contará dados espúrios após o último caractere de nova linha como uma linha extra).

Padrões curinga como *.txt , por padrão, não incluem arquivos ocultos.

Com o GNU awk :

awk 'ENDFILE{print FNR}' ./*.txt

Desta vez, você receberá um 0 para arquivos vazios. A mesma nota sobre dados espúrios do GNU sed .

$ seq 10 > a.txt; : > b.txt; printf spurious > c.txt; seq 20 > .hidden.txt; echo test > $'a\n3 4.txt'
$ wc -l ./*.txt
 1 ./a
3 4.txt
10 ./a.txt
 0 ./b.txt
 0 ./c.txt
11 total
$ wc -l ./*.txt | awk '/\//{print $1}'
1
10
0
0
$ sed -ns '$=' ./*.txt
1
10
1
$ awk 'ENDFILE{print FNR}' ./*.txt
1
10
0
1

Recursivamente, se você quiser uma lista classificada por nome de arquivo, com zsh ou ksh -o globstar ou bash -O globstar ou yash -o extended-glob :

wc -l .//**/*.txt | awk '/\/\//{print $1}'
sed -ns '$=' ./**/*.txt
awk 'ENDFILE{print FNR}' ./**/*.txt
    
por 18.11.2015 / 12:14
5
wc -l -- *.txt

ou se você não quiser os nomes de arquivos na saída (assumindo aqui que os nomes dos arquivos não contenham caracteres de nova linha):

wc -l -- *.txt | awk '{print $1}'

Se houver muitos arquivos * .txt para caber em uma única linha de comando do shell e supondo que seu find suporta -maxdepth :

find . -maxdepth 1 -type f -name '*.txt' -exec wc -l {} + | 
    awk '$2 != "total" {print $1}'

(note que aquele, ao contrário do anterior, não irá ordenar a lista de arquivos, incluirá arquivos ocultos e excluirá arquivos não-regulares, incluindo links simbólicos para arquivos regulares).

Você pode, obviamente, redirecionar a saída de qualquer um deles para um arquivo ou enviá-lo para outro programa para mais processamento.

    
por 18.11.2015 / 11:57
1

Você pode usar curingas em combinação com wc para obter o número de linhas de cada arquivo:

wc -l *.txt

A saída será a seguinte:

13 a.txt

29 b.txt

3 d.txt

45 total

Se você não quiser o total de linhas, você pode canalizá-lo para o comando desde que tenha mais de um arquivo para contar :

wc -l *.txt |head -n -1

Se você quiser apenas o número da linha e não o arquivo:

wc -l *.txt |head -n -1 |awk '{print $1}'

Como alternativa, você pode tentar com loops for para evitar a contagem total se houver um arquivo ou mais de um arquivo, mas é a maneira mais feia:

for i in $(ls *.txt);do wc -l $i;done

    
por 18.11.2015 / 12:08