Seguem dois scripts para realizar ações muito comuns para quem trabalha com muitos arquivos: listar número de arquivos em vários diretórios de uma só vez e verificar se arquivos de texto estão com conteúdo. No segundo script, é realizado um for interessante: o avanço no nome dos diretórios e arquivos, em forma de data, se dá utilizando a função “date”.
Contagem de arquivos, diretórios e links
O script a seguir deve ser incluir o nome do diretório que contenha os subdiretórios onde será realizado o cálculo do número de arquivos, diretórios e links contidos em cada um. Caso o diretório a ser trabalhado não seja informado, as estatísticas serão geradas nos subdiretórios que estão no mesmo local do arquivo que está rodando.
#!/bin/bash # Script para listar numero de arquivos em cada diretorio em até um subnivel # Diretorio a ser trabalhado (pasta local se nao for informado) pasta=$1 # Listar somente diretorios for DIR in $(ls -d $pasta*/); do # Contar número de arquivos do diretório NUMDIR=$(ls -lR "$DIR" | grep '^d' | wc -l) NUMLIN=$(ls -lR "$DIR" | grep '^l' | wc -l) NUMARQ=$(ls -lR "$DIR" | grep '^-' | wc -l) # Imprimir saida echo "$DIR: $NUMDIR diretórios, $NUMARQ arquivos e $NUMLIN links simbólicos" done
Note que são utilizadas duas formas para listar somente diretórios: a primeira considera que, ao listar diretórios, eles terminam com barra; já a segunda, ao realizar uma listagem completa, o primeiro caractere de uma linha contendo diretório é o “d”.
Verificar se arquivo está com ou sem conteúdo
O script a seguir varre os diretórios escritos em DIR (informado no próprio script) e realiza a verificação para ver se o arquivo tem conteúdo (‘if’ com parâmetro ‘-s’) ou está “zerado”.
#!/bin/bash # Script para verificar se arquivos estão com dados DIR='/home/user/dados' cd $DIR dia_ini="2015-07-13" for n in $( seq 1 213 ); do folder=$(date --date="$dia_ini +$n days" +%Y-%m-%d) for i in $( seq 0 5 1439 ); do hm=$(date --date="0000 +$i minutes" +%H%M) file=$folder"_$hm.dat" if [ -s $DIR/$folder/alertas_$file ]; then echo $file "com conteúdo" else echo $file "arquivo zerado" fi done done
Nesse caso, os diretórios possuem o nome como uma data seguindo a estrutura YYYY-MM-DD, contendo arquivos cujo nome segue a estrutura alertas_YYYY-MM-DD_HHMM.dat (“alertas_2015-07-13_2245.dat”, por exemplo). Assim, o loop para diretórios e o loop para arquivos envolvem criar uma sequência numérica avançando de 1 em 1 ou de 5 em 5 (segundo caso) para criar incrementos no tempo. Dessa forma, avança-se o nome do diretório 1 dia a cada loop e 5 minutos no loop interno.