No Bash Script, como eu me transformo em um diretório dentro do meu diretório atual?

0

Então, meu código atual é assim: scan.h

#!/bin/bash
while IFS= read -r line;
do
    byte=$(stat -c%s "$line");
    echo "$line : $byte";
done< <(ls *.$1)

No UNIX, uma vez que eu executo meu código, ele seria pré-formado assim:

./scan.sh cpp
arraysum.cpp : 359
countLines.cpp : 1199
createtext.cpp : 240
multiproc1.cpp : 196
myWc.cpp : 1230
test.cpp : 193

Isso é esperado, pois mostra todos os arquivos .cpp em meu diretório atual, seguidos por sua contagem de bytes. No entanto, eu também quero localizar os outros arquivos nas pastas do meu diretório, mas não consigo descobrir como atravessá-los.

Sidenote: Também só por curiosidade, é de qualquer maneira que eu poderia classificar minhas declarações impressas com base no tamanho do byte?

    
por Li Wang 08.10.2018 / 01:05

1 resposta

0

Em geral, você usaria find para pesquisar diretórios recursivamente, por exemplo,

find . -name '*.cpp'

Se você tiver o GNU find , poderá imprimir o nome do arquivo e o tamanho em bytes diretamente, evitando uma chamada para stat

find . -name '*.cpp' -printf '%f:%s\n'

Se você não se importar em reverter o pedido, poderá gerar os resultados de uma maneira que não seja ambiguamente classificável - por exemplo, classificar numericamente de alto a baixo

find ../src -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn

Você sempre pode trocar os campos após a classificação, por exemplo, com Awk - que também permite que você selecione apenas os 5 primeiros resultados, por exemplo:

find . -name '*.cpp' -printf '%s:%f\n' | sort -t: -rn | awk -F: 'NR==6 {exit} {print $2 " : " $1}'

Finalmente, se você quiser tornar seguro qualquer nome de arquivo "legal" (incluindo aqueles com novas linhas), null encerrar tudo

find . -name '*.cpp' -printf '%s:%f
find . -name '*.cpp'
' | sort -t: -zrn | awk -vRS='
find . -name '*.cpp' -printf '%f:%s\n'
' -F: 'NR==6 {exit} {print $2 " : " $1}'
    
por 08.10.2018 / 01:55