Unterverzeichnisse mit der niedrigsten Nummer finden

Unterverzeichnisse mit der niedrigsten Nummer finden

Ich versuche, alle Unterverzeichnisse mit der niedrigsten Nummer aufzulisten.

Beispielsweise für die folgende Liste:

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

Ich möchte nur Folgendes erhalten:

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

Antwort1

Für das unterste Verzeichnis jedes Verzeichnisses müssen Sie die Ausgabe in jedem Verzeichnis sortieren.

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

Der Befehl ls erledigt das automatisch, sortiert aber standardmäßig alphanumerisch. Wenn alle Ihre Unterverzeichnisse Namen mit der gleichen Länge haben, ist das akzeptabel.

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

So funktioniert es: for SUBDIR in $SUBDIRLIST
Schauen Sie in jedes Verzeichnis in der Liste. Die Liste ist in der vorherigen Zeile definiert. Ich habe 10? gewählt, um Einträge auszuwählen, die drei Zeichen lang sind und mit 10 beginnen, aber Sie hätten genauso gut sagen können, SUBDIR=*ob Sie alles verwenden möchten.

ls -d $SUBDIR/????

  • lsBefehl zum Anzeigen sortierter Einträge des Inhalts von $SUBDIR
  • Das ????wählt nur Einträge aus, die vier Zeichen lang sind. Sie können * wählen, wenn es Ihnen egal ist, oder wenn Sie andere Verzeichnisse haben, die ignoriert werden sollen, schränken Sie es weiter ein, indem Sie einen Ausdruck wie folgt verwenden:20??

| head -1 - Übergeben Sie die Liste dem „Head-Befehl“. – Head zeigt nur die erste Zeile an und verwirft den Rest.

Sie benötigen eine etwas andere Lösung, wenn nicht alle Verzeichnisnamen die gleiche Länge haben, zB:
SUBDIRLIST=10? for SUBDIR in $SUBDIRLIST do find $SUBDIR -depth 1 | sort -n | head -1 done

In diesem Fall verwenden wir find, weil ls die Einträge zwar sortieren würde, dies aber falsch machen würde und daher redundant ist. Find sortiert die Einträge nicht (ist Standard).

sort -nAnschließend werden die gefundenen Elemente sortiert und dabei -ndarauf geachtet, dass sie als Zahlen behandelt werden, so dass 20 vor 100 kommt.

Verwirft erneut head -1alles außer der ersten Zeile.

Und schließlich SUBDIRLIST=10?wählt die Anweisung nur Unterverzeichnisse aus, die mit 10 beginnen und drei Zeichen im Namen haben. Sie können dies je nach Bedarf mehr oder weniger einschränken. Beispielsweise SUBDIRLIST=*wählt „alles auswählen“ SUBDIRLIST=???alle Einträge aus, die drei Zeichen haben.

Antwort2

Das hier sollte funktionieren:

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

Ausgabe:

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

Antwort3

Für diese Eingabe kann dies folgendermaßen erfolgen:

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

awksortiert nach dem ersten Feld. Ich weiß nicht, ob das garantiert ist oder nur Zufall. Um sicherzugehen, können Sie die awk-Ausgabe in

sort --field-separator=/ -n

Antwort4

Etwas wie das?

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

Hinweis: Dieses Skript schlägt fehl, wenn das zweite Verzeichnis eine andere Ziffernnummer hat

verwandte Informationen