for z in *.zip; do if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?//p') < 15 )); then echo "$z"; fi; done
Isso lista os arquivos .zip com menos de 15 arquivos para stdout (no terminal), portanto, se você quiser criar um arquivo de lista, poderá tee out ou redirecionar. Aqui está mais legível, criando um arquivo de lista no final, assim como imprimindo no terminal
for z in *.zip; do
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?//p') < 15 )); then
echo "$z"
fi
done | tee small-zip-list
Notas
-
for z in *.zipfaz um loop sobre os arquivos que terminam com.zipe faz algo para cada um, representado pela variávelzreferenciada com$z -
if (( $(unzip -l "$z" | sed -nr '$ s/.* ([0-9]+) files?//p') < 15 ))faz o unzip contar os arquivos, extrai o número da saída (com certeza há uma maneira mais clara de extrair apenas o número, mas eu seised, então eu usei - veja @muru's comment para um maneira mais simples que pode ser mais rápida com muitos arquivos) e testar se é menor que 15, e se é -
echo "$z", em seguida, imprima o nome do arquivo -
| tee small-zip-listtambém imprime a saída para um novo arquivo, bem como no terminal