Encontre diretórios contendo um certo número de arquivos

10

Eu esperava poder fazer isso com o comando find , mas não vejo nenhum teste no manual para fazer o que eu quero. Gostaria de poder encontrar quaisquer diretórios no diretório de trabalho que contenham menos que, mais que ou exatamente a contagem que eu especificar.

find . -filecount +10 # any directory with more than 10 entries
find . -filecount 20 # any directory with exactly 20 entries

Mas, infelizmente, não existe essa opção.

    
por Paul Ruane 08.07.2013 / 19:04

3 respostas

15

Você poderia tentar isso, para obter os nomes dos subdiretórios e o número de arquivos / diretórios que eles contêm:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Se você quiser fazer o mesmo para todos os sub-diretórios (busca recursiva) use isto:

find . -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \;

Para selecionar os diretórios com exatamente 10 arquivos:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
  awk '$NF==10'

10 ou mais:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF>=10'

10 ou menos:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{} '; ls '{}' | wc -l" \; | 
 awk '$NF<=10'

Se você quiser manter apenas o nome do diretório (por exemplo, você quer canalizá-lo para outro processo a jusante como @evilsoup sugerido), você pode usar isto:

find . -maxdepth 1 -type d -exec bash -c "echo -ne '{}\t'; ls '{}' | wc -l" \; | 
 awk -F"\t" '$NF<=10{print $1}'
    
por 08.07.2013 / 20:49
3

Para listar subdiretórios imediatos contendo exatamente $NUM arquivos.

find -maxdepth 2 -mindepth 2 -type f -printf '%h
find -maxdepth 2 -mindepth 2 -type f -printf '%h
find -maxdepth 2 -mindepth 2 -type f -printf '%h
find -maxdepth 2 -mindepth 2 -type f -printf '%h
find -maxdepth 2 -mindepth 2 -type f -printf '%h
find -maxdepth 2 -mindepth 2 -type f -printf '%h%pre%' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'
' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'
' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'
' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]<num) printf "%s\n", line}'
' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]>num) printf "%s\n", line}'
' | awk -v num="$NUM" 'BEGIN{RS="%pre%"} {array[$0]++} END{for (line in array) if (array[line]==num) printf "%s\n", line}'

Para listar subdiretórios imediatos contendo maior que $NUM arquivos.

%pre%

Para listar subdiretórios imediatos contendo menos que $NUM arquivos.

%pre%

Os itens são finalizados por um caractere nulo %h , portanto, os nomes de arquivo que contêm novas linhas ou outros tipos de espaço em branco serão interpretados corretamente. O dirname imprime o awk de cada arquivo. %code% usa uma matriz para contar quantas vezes encontra cada diretório, imprimindo-o se as condições forem atendidas.

Por favor, note que nenhum dos comandos acima mencionados exibirá diretórios contendo zero arquivos. Observe também que por arquivo estou me referindo a arquivos regulares, não links, diretórios, sockets, blocos, pipes nomeados, etc.

Eu tentei fazer isso da maneira mais simples possível. Se você quiser encontrar subdiretórios recursivos ou os arquivos contidos nele, é necessário um comando modificado. Existem muitas possibilidades para listar todas elas.

    
por 28.07.2015 / 13:07
2

Tente isto:

[ 'find . | wc -l' -eq 10 ] && echo "Found"

[ 'find . | wc -l' -gt 10 ] && echo "Found"

[ 'find . | wc -l' -lt 10 ] && echo "Found"

Neste exemplo, você pode verificar se o diretório CURRENT contém exatamente 10, mais de 10 e menos de 10 arquivos / diretórios. Se você precisa verificar o bando de diretórios, apenas use o loop.

    
por 08.07.2013 / 19:43

Tags