So zeigen Sie im Linux-Terminal eine sortierte Liste von Dateien an, die bestimmte Zeichenfolgen enthalten

So zeigen Sie im Linux-Terminal eine sortierte Liste von Dateien an, die bestimmte Zeichenfolgen enthalten

Angenommen, ich habe 3 Ordner in verschiedenen Verzeichnissen, von denen einige weitere Unterordner enthalten, und in jedem Ordner/Unterordner habe ich Textdateien mit den Namen test1, test2, test3usw., die die Zeichenfolge helloirgendwie enthalten. Es kann einfach nur sein hello, es kann sein helloJASKFNASKFNusw.

Wie kann ich eine sortierte Liste dieser Dateien anzeigen? Angenommen, ich möchte nach ihren Namen oder nach dem Änderungsdatum sortieren. Ich verstehe, dass ich den Befehl grepoder verwenden kann find, um diese Dateien zu suchen und anzuzeigen, aber ich bin nicht sicher, wie ich sie sortiert anzeigen kann.

Antwort1

Es ist einfacher, wenn Sie die Dateiliste zuerst sortieren, bevor Sie sie an Folgendes weitergeben grep:

In zshkönnen Sie Folgendes tun:

grep -le hello -- **/test<->(.)

Dabei wird nach hellodem Inhalt von Dateien gesucht, deren Namen testvon einer oder mehreren Dezimalstellen gefolgt werden ( <->eine Form des <x-y>Musters zum Abgleichen von Zahlenbereichen), und zwar im aktuellen Arbeitsverzeichnis oder darunter. Versteckte Verzeichnisse werden übersprungen.

Glob-Erweiterungen werden standardmäßig nach Namen sortiert.

Um nach Änderungszeit zu sortieren, verwenden Sie (.om)anstelle von (.). oder (.oL)nach Größe. info zsh qualifiersDie Liste der Glob-Qualifizierer und die Liste der Kriterien, onach denen der Qualifizierer sortieren kann, finden Sie unter.

Ersetzen Sie oes durch O, um die Reihenfolge umzukehren ( Onum umgekehrt nach Namen zu sortieren).

Verwenden Sie (.n)für die Sortierung den Namen als numerisch ( test10nach test9, nicht zwischen test1und test2).

Wenn Sie auf einenZu viele ArgumenteFehler (verursacht durch eine Einschränkung des execve()Systemaufrufs der meisten Systeme):

autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --

Mit GNU-Tools und jeder Shell (außer (t)csh, wo Sie den Befehl in eine Zeile setzen müssen):

So sortieren Sie nach Namen:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -print0 |
  sort -z |
  xargs -r0 grep -le hello --

( -VOption sortfür numerische Sortierung hinzufügen)

So sortieren Sie nach Änderungszeitpunkt:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
  sort -zrn |
  cut -zf2- |
  xargs -r0 grep -le hello --

Hinzufügen/Entfernen -r, sortum die Reihenfolge umzukehren.

verwandte Informationen