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/????
ls
comando 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 -n
em seguida, classifica os itens encontrados, -n
garantindo que sejam tratados como números, de modo que 20 venha antes de 100.
Mais uma vez head -1
descarta 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] };}'
awk
classifica 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