buscar subdirectorios con el número más bajo

buscar subdirectorios con el número más bajo

Estoy intentando enumerar todos los subdirectorios con el número más bajo.

Por ejemplo, para la siguiente lista:

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

Estoy buscando obtener solo:

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

Respuesta1

Para el directorio más bajo de cada directorio, deberá ordenar la salida en cada directorio.

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

el comando ls hace eso automáticamente, pero realiza una clasificación alfanumérica de forma predeterminada. Si todos sus subdirectorios tienen nombres con la misma longitud, entonces será aceptable.

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

Cómo funciona esto: for SUBDIR in $SUBDIRLIST
busque en cada directorio de la lista. La lista está definida en la línea anterior. Elegí usar 10? para seleccionar entradas que tengan tres caracteres y comiencen con 10, pero también podría haberlo dicho SUBDIR=*si desea usar todo.

ls -d $SUBDIR/????

  • lscomando para mostrar entradas ordenadas del contenido de $SUBDIR
  • Selecciona ????sólo entradas que tengan cuatro caracteres. Es posible que desee elegir * si no le importa, o si tiene otros directorios que deben ignorarse, limítelo aún más usando una expresión como20??

| head -1 - Pase la lista a través del "comando head" - Head mostrará solo la primera línea y descartará el resto.

Necesita una solución ligeramente diferente si todos los nombres de directorio no tienen la misma longitud, por ejemplo:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

En este caso usamos find porque ls ordenaría las entradas, pero lo haría mal, por lo que es redundante. Buscar no ordena las entradas (es el valor predeterminado).

sort -nluego ordena los elementos encontrados, donde -nse asegura de que se traten como números, de modo que 20 esté antes de 100.

Una vez más head -1descarta todo excepto la primera línea.

Y finalmente la SUBDIRLIST=10?declaración selecciona sólo subdirectorios que comienzan con 10 y tienen tres caracteres en el nombre. Puedes limitarlo más o menos, según tus necesidades. Por ejemplo, SUBDIRLIST=*selecciona todo, SUBDIRLIST=???selecciona todas las entradas que tengan tres caracteres.

Respuesta2

Esto debería funcionar:

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

Salida:

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

Respuesta3

Para esta entrada esto se puede hacer con:

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

awkordena por el primer campo. No sé si esto es una garantía o simplemente una coincidencia. Para estar seguro, puede canalizar la salida de awk a

sort --field-separator=/ -n

Respuesta4

¿Algo como esto?

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

nota: este script fallará cuando el segundo directorio tenga un número de dígitos diferente

información relacionada