Script de shell para localizar e contar o número total de caracteres em todos os arquivos

1

Como posso criar um script que encontre todos os arquivos em seu diretório inicial com menos de três dias e, em seguida, obtenha uma contagem do número total de caracteres em todos esses arquivos?

    
por pnizi 05.02.2015 / 05:59

3 respostas

1

Isso é simples:

find ~/ -mtime -3 -exec cat {} + | wc -c

Os envios acima contam cada caractere em cada arquivo com wc , o que os conta.

Se os arquivos são grandes, o acima envolveria muita leitura do disco. Se seria muito mais eficiente simplesmente adicionar os tamanhos dos arquivos. Os métodos para obter o tamanho de um arquivo variam entre as versões do Unix. Se o seu sistema suportar um comando stat no estilo linux, o seguinte comando funcionará:

find . -mtime -3 -type f -exec stat -c%s {} + | awk '{total+=$1} END{print total}'

Acima, stat -c%s retorna o tamanho de cada arquivo e awk os adiciona e informa sobre o total. Isso elimina a necessidade de ler completamente cada arquivo.

    
por 05.02.2015 / 06:15
1

Com find , cat e wc :

find ~ -type f -mtime -3 -exec cat {} + | wc -c
  • -mtime verifica os tempos de modificação. Dependendo do seu sistema operacional e sistema de arquivos, o tempo de criação não é fácil de obter. O tempo de modificação é um compromisso razoável. -3 significa menos de 3 dias (em oposição a +3 ). Na verdade, 72 horas.
  • -type f - restringindo-nos a arquivos regulares.
  • -exec cat {} + - chame cat em cada um dos arquivos correspondentes,
  • wc -c : imprime a contagem de caracteres. Como temos uma saída combinada de todos os cat s, esse é o total.
por 05.02.2015 / 06:15
1

Tente isso

find ./ -type f -mtime -3 -exec wc -c {} \; | perl -lane 'BEGIN {$total=0}; $total+=$F[0]; END {print $total}'

Exemplos

❮njia@mb-125:~/src/ansible/roles❯➤ find ./ -type f -mtime -3 -exec wc -c {} \;
12288 ./base/tasks/.check_glibc.yml.swp
185 ./base/tasks/check_glibc.yml
❮njia@mb-125:~/src/ansible/roles❯➤ find ./ -type f -mtime -3 -exec wc -c {} \; |    perl -lane 'BEGIN {$total=0}; $total+=$F[0]; END {print $total}'
12473
    
por 05.02.2015 / 06:15