localize subdiretórios com menor número

1

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

Por exemplo, para a seguinte lista:

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

Estou procurando apenas:

/100/2001  
/101/2001  
/102/2000
    
por Loesje 06.05.2014 / 11:25

5 respostas

1

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 subdiretórios tiverem nomes com o mesmo tamanho, 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ê pode ter dito SUBDIR=* se quiser usar tudo.

ls -d $SUBDIR/????

  • Comando ls para exibir entradas classificadas do conteúdo de $ SUBDIR
  • O ???? seleciona apenas entradas com quatro caracteres. Você pode querer escolher * se não se importa, ou se você tem outros diretórios que devem ser ignorados, limitar ainda mais usando uma expressão como 20??

| head -1 - Passe a lista através do "comando de cabeça" - 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 forem do mesmo tamanho, por exemplo:% SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

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

sort -n , em seguida, classifica os itens encontrados, em que -n certifica-se de que eles são tratados como números, de modo que 20 são anteriores a 100.

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

Finalmente, a instrução SUBDIRLIST=10? seleciona apenas os subdiretórios que começam com 10 e possuem três caracteres no nome. Você pode limitá-lo mais ou menos, dependendo das suas necessidades. Por exemplo, SUBDIRLIST=* seleciona tudo, SUBDIRLIST=??? seleciona todas as entradas com três caracteres.

    
por 06.05.2014 / 11:42
0

Isso deve funcionar:

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

Ouput:

/100/2001
/101/2001
/102/2000
    
por 06.05.2014 / 11:39
0

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] };}'

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

sort --field-separator=/ -n
    
por 06.05.2014 / 11:44
0

Em Perl:

perl -le 'for (</*/*>){ 
              ($first,$second)=(split m{/})[1,2]; 
              push @{$entries{$first}},$second 
          }
          END{
              for (sort {$a<=>$b} keys %entries){
                  $lowest = shift sort {$a<=>$b} @{$entries{$_}};
                  print "/$_/$lowest\n";
              }
          }'

Isso pressupõe que todos os seus diretórios tenham nomes puramente numéricos.

    
por 06.05.2014 / 11:50
-1

Algo parecido com isto?

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

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

    
por 06.05.2014 / 11:35

Tags