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
, test3
usw., die die Zeichenfolge hello
irgendwie enthalten. Es kann einfach nur sein hello
, es kann sein helloJASKFNASKFN
usw.
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 grep
oder 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 zsh
können Sie Folgendes tun:
grep -le hello -- **/test<->(.)
Dabei wird nach hello
dem Inhalt von Dateien gesucht, deren Namen test
von 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 qualifiers
Die Liste der Glob-Qualifizierer und die Liste der Kriterien, o
nach denen der Qualifizierer sortieren kann, finden Sie unter.
Ersetzen Sie o
es durch O
, um die Reihenfolge umzukehren ( On
um umgekehrt nach Namen zu sortieren).
Verwenden Sie (.n)
für die Sortierung den Namen als numerisch ( test10
nach test9
, nicht zwischen test1
und 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 --
( -V
Option sort
fü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
, sort
um die Reihenfolge umzukehren.