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/????
ls
comando 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 -n
luego ordena los elementos encontrados, donde -n
se asegura de que se traten como números, de modo que 20 esté antes de 100.
Una vez más head -1
descarta 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] };}'
awk
ordena 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