encontre subdiretórios com menor número

encontre subdiretórios com menor número

Estou tentando listar todos os subdiretórios com o número mais baixo.

Por exemplo, para a lista a seguir:

/100/2001  
/100/2003  
/101/2001  
/101/2004  
/102/2000  
/102/2003  
/102/2005  

Estou procurando obter apenas:

/100/2001  
/101/2001  
/102/2000

Responder1

Para o diretório mais baixo de cada diretório, você precisará classificar a saída em cada diretório.

/100/2001
/100/2003
/101/2001
/101/2004
/102/2000
/102/2003
/102/2005

o comando ls faz isso automaticamente, mas faz a classificação alfanumérica por padrão. Se todos os seus subsubdiretórios tiverem nomes com o mesmo comprimento, isso será aceitável.

SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do ls -d $SUBDIR/???? | head -1 done

Como isso funciona: for SUBDIR in $SUBDIRLIST
procure em cada diretório da lista. A lista é definida na linha anterior. Eu escolhi usar 10? para selecionar entradas com três caracteres e começar com 10, mas você poderia muito bem ter dito SUBDIR=*se deseja usar tudo.

ls -d $SUBDIR/????

  • lscomando para exibir entradas classificadas do conteúdo de $ SUBDIR
  • O ????seleciona apenas entradas com quatro caracteres. Você pode escolher * se não se importar, ou se tiver outros diretórios que devem ser ignorados, limite-o ainda mais usando uma expressão como20??

| head -1 - Passe a lista pelo "comando head" - Head exibirá apenas a primeira linha e descartará o restante.

Você precisa de uma solução um pouco diferente se todos os nomes de diretório não tiverem o mesmo comprimento, por exemplo:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

Neste caso usamos find porque ls classificaria as entradas, mas faria errado, por isso é redundante. Find não classifica as entradas (é o padrão).

sort -nem seguida, classifica os itens encontrados, -ngarantindo que sejam tratados como números, de modo que 20 venha antes de 100.

Mais uma vez head -1descarta tudo, exceto a primeira linha.

E finalmente a SUBDIRLIST=10?instrução seleciona apenas subdiretórios começando com 10 e tendo três caracteres no nome. Você pode limitar mais ou menos, dependendo de suas necessidades. Por exemplo, SUBDIRLIST=*seleciona tudo, SUBDIRLIST=???seleciona todas as entradas com três caracteres.

Responder2

Isso deve funcionar:

ls -1d /*/200{0,1}

Saída:

/100/2001
/101/2001
/102/2000

Responder3

Para esta entrada isso pode ser feito com:

awk -F/ 'min[$2]==0 { min[$2]=$3; next; }; 
 { if (min[$2]>$3) min[$1]=$3;}; 
 END {for (val in min) { print "/" val "/" min[val] };}'

awkclassifica pelo primeiro campo. Não sei se isso é garantido ou apenas coincidência. Para ter certeza, você pode canalizar a saída do awk para

sort --field-separator=/ -n

Responder4

Algo assim?

for firstdir in `ls .`; do
  seconddir=`ls -1 ./$firstdir | head -n 1`
  echo $firstdir/$seconddir
done

nota: este script falhará quando o segundo diretório tiver números de dígitos diferentes

informação relacionada