Suchen Sie Dateien alphabetisch vor einer bestimmten Zeichenfolge

8

Wenn ich ein Verzeichnis voller Dateien und Unterverzeichnisse habe. Was ist der beste Weg, um nur die regulären Dateien aufzulisten, die alphabetisch vor einer bestimmten Zeichenfolge stehen?

Derzeit kann ich mit Bash am besten Folgendes tun:

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

Ich habe das Gefühl, dass es einen prägnanteren Weg gibt, dies zu tun, aber ich bin mir nicht sicher, was es ist. Irgendwelche Ideen?

Mike Deck
quelle

Antworten:

4

wenn Sie alle brauchen

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

wenn du den ersten brauchst

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'
iruvar
quelle
Vielen Dank! Eine Variation davon, um alle Dateien zwischen den angegebenen Variablen zu erhalten, wäre:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay
3

Damit sedist es prägnanter:

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

Dies bedeutet, dass (nach dem Sortieren) die Referenzzeile (oder höher) und alle Zeilen, die auf die letzte Zeile folgen, gelöscht werden.

Der Befehl sed 'd' wird hier mit einem Adressbereich verwendet, wobei '/^./reference/' der Anfang und '$' das Ende des Bereichs ist. (Und '$' als Adresse bedeutet die letzte Zeile.)

maxschlepzig
quelle
3

Obligatorische zsh-Antwort, bei der mit dem . Glob-Qualifikationsmerkmal nur reguläre Dateien ausgewählt und eweitere Übereinstimmungen ausgewählt werden:

echo *(.e\''[[ $REPLY > reference ]]'\')
Gilles 'SO - hör auf böse zu sein'
quelle
3

z.B. script-name "$HOME" "reference"... findgibt nicht immer den führenden Wert aus ./, wie im Fall von find binoder find /tmp. Wenn Sie also nur die Basisnamen der Datei möchten, funktioniert dies.

Update: Hinzugefügt tolower () für einen Fall unempfindlich Vergleich zu ermöglichen, die die erzeugt alphabetische Sortierung in der Frage erwähnt ...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

Pipe es einfach sortnach awk, wenn Sie es sortiert brauchen.

Peter.O
quelle
Das scheint nicht zu funktionieren. Ich habe den letzten Teil des awk-Skripts so geändert, $0 < refdass er funktioniert, aber da die Ausgabe von find keine Leerzeichen enthält, ist das $ 2-Feld nicht vorhanden. Vermisse ich etwas
Mike Deck
Danke, ich habe im letzten Moment eine schnelle Änderung vorgenommen und dieses Feld verpasst (es hatte ursprünglich zwei durch \ xFF getrennte Felder) ... Jetzt, wo ich ein bisschen geschlafen habe, kann ich sehen, dass dies nicht der Fall ist Handhabung Fall richtig. Ich gehe davon aus, dass die Frage, da sie sich auf eine alphabetische Zusammenstellung bezieht , die Groß- und Kleinschreibung nicht berücksichtigt . Ich habe die Antwort aktualisiert.
Peter.O