Bash: Encontre pastas com menos de x arquivos

6

Como eu encontraria todas as pastas em um diretório que contivesse menos que x número de .flac arquivos?

    
por Leda 18.09.2010 / 23:07

2 respostas

9
  • Para cada subdiretório, imprima o nome do subdiretório se houver no máximo 42% dos arquivos.flac no subdiretório. Para executar um comando nos diretórios, substitua -print by -exec … \; . Compatível com POSIX.

    find . -type d -exec sh -c 'set -- "$0"/*.flac; [ $# -le 42 ]' {} \; -print
    

    Observe que este comando não funcionará para procurar diretórios contendo zero .flac files ( "$0/*.flac" expande para pelo menos uma palavra). Em vez disso, use

    find . -type d -exec sh -c 'set -- "$0"/*.flac; ! [ -e "$1" ]' {} \; -print
    
  • O mesmo algoritmo em zsh. **/* expande para todos os arquivos no diretório atual e seus subdiretórios recursivamente. **/*(/) restringe a expansão aos diretórios. {.,**/*}(/) adiciona o diretório atual. Finalmente, (e:…:) restringe a expansão para as correspondências para as quais o código de shell retorna 0.

    echo {.,**/*}(/e:'set -- $REPLY/*.flac(N); ((# <= 42))':)
    

    Isso pode ser dividido em duas etapas para legibilidade.

    few_flacs () { set -- $REPLY/*.flac(N); ((# <= 42)); }
    echo {.,**/*}(/+few_flacs)
    

Changelog :
• manipule x = 0 corretamente.

    
por 19.09.2010 / 01:45
2

Substitua $MAX pelo seu próprio limite:

find -name '*.flac' -printf '%h\n' | sort | uniq -c | while read -r n d ; do [ $n -lt $MAX ] && printf '%s\n' "$d" ; done

Observação: isso imprimirá todos os subdiretórios com um número de .flac arquivos entre 0 e $MAX (ambos excluídos).

    
por 18.09.2010 / 23:48