Esperava poder fazer isso com o find
comando, mas não vejo nenhum teste no manual para fazer o que quero. Gostaria de encontrar quaisquer diretórios no diretório de trabalho que contenham menos que, mais ou exatamente a contagem especificada.
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.
Respostas:
Você pode tentar isso para obter os nomes dos subdiretórios e o número de arquivos / diretórios que eles contêm:
Se você quiser fazer o mesmo para todos os subdiretórios (localização recursiva), use-o:
Para selecionar os diretórios que possuem exatamente 10 arquivos:
10 ou mais:
10 ou menos:
Se você deseja manter apenas o nome do diretório (por exemplo, deseja canalizá-lo para outro processo a jusante, como @evilsoup sugeriu), você pode usar isso:
fonte
find . -type d -exec bash -c 'echo -ne "{} "; ls "{}" | wc -l' \; | awk '$NF<=10'
Para listar subdiretórios imediatos contendo exatamente
$NUM
arquivos.Para listar subdiretórios imediatos contendo arquivos maiores que
$NUM
.Para listar subdiretórios imediatos contendo menos de
$NUM
arquivos.Os itens são finalizados com um caractere nulo
\0
; portanto, os nomes de arquivos que contêm novas linhas ou outros tipos de espaço em branco serão interpretados corretamente. O%h
imprime cada arquivo dedirname
.awk
depois usa uma matriz para contar quantas vezes encontra cada diretório, imprimindo-o se as condições forem atendidas.Observe que nenhum dos comandos mencionados acima exibirá diretórios contendo zero arquivos. Observe também que, por arquivo, estou me referindo a arquivos regulares, não a links, diretórios, soquetes, blocos, pipes nomeados, etc.
Eu tentei fazer isso da maneira mais simples possível. Se você deseja encontrar subdiretórios recursivos ou seus arquivos, é necessário um comando modificado. Existem muitas possibilidades para listar todas elas.
fonte
Tente o seguinte:
Nestes exemplos, você pode verificar se o diretório CURRENT contém exatamente 10, mais que 10 e menos que 10 arquivos / diretórios. Se você precisar verificar vários diretórios, use loop.
fonte
.
), você pode querer modificar de acordo.wc -l < <(printf %s\\n ./*)
ouprintf %s\\n ./* | wc -l
dentro do teste para evitar umafind
chamada desnecessária . Isso também evitará o problema que o @terdon observou, de incluir.
no resultado. No entanto, também haveria o problema de ignorar arquivos começando com a.
; Gostaria de resolver isso comshopt -s dotglob
(para fazer bolhas corresponder arquivos começando com um.
, mas não.
ou..
).