Ich suche in meinem Home-Verzeichnis nach Dateien, die in den letzten zwei Minuten geändert wurden und außerdem eine bestimmte Zeichenfolge enthalten. Ich habe es mit diesem Befehl versucht:
find -type d -mmin -2 -ls | grep -Ril "mystring"
Es scheint zu funktionieren, aber anscheinend werden nur die Dateien gedruckt, die die angegebene Zeichenfolge enthalten, und nicht die Dateien, die zuletzt vor 2 Minuten geändert wurden und die Zeichenfolge enthalten. Es scheint, als würde der erste Teil des Befehls nicht ausgeführt.
Antwort1
Du hast mit deinem eigenen Vorschlag einen guten Versuch unternommen
find -type d -mmin -2 -ls | grep -Ril "mystring"
Dadurch wären Verzeichnisse ( -type d
) identifiziert worden, die innerhalb der letzten zwei Minuten geändert wurden, statt Dateien ( -type f
). Wenn die Ausgabe von -ls
an weitergeleitet würde grep
, wäre normalerweise in den generierten Dateinamen nach gesucht worden mystring
. In diesem Fall -R
ändert das Flag jedoch das Verhalten von grep
und ignoriert Ihre Liste mit Dateinamen. Stattdessen wird jede Datei im aktuellen Verzeichnis und darunter durchsucht.
Teilen wir das Problem also in zwei Teile auf
Suche in deinem Home-Verzeichnis nach den zuletzt geänderten Dateien der letzten 2 Minuten
find ~ -type f -mmin -2
[Dateien] die einen bestimmten String enthalten
grep -Fl 'certain String' {files...}
Jetzt müssen Sie sie zusammenfügen. Dies {}
ist ein Platzhalter für die Dateinamen, die in find
Schritt 1 generiert wurden, und das nachfolgende +
zeigt an, dass die {}
wiederholt werden können.mehrmals, also mehrere Dateinamen
find ~ -type f -mmin -2 -exec grep -Fl 'certain String' {} +
Durch Ändern von grep
„in“ echo grep
wird angezeigt, was vom find
Befehl ausgeführt wird. Dies kann eine nützliche Methode zur Fehlerbehebung sein:
find ~ -type f -mmin -2 -exec echo grep -Fl 'certain String' {} +
Führen Sie bitte man find
und aus, man grep
um herauszufinden, welche verschiedenen Optionen es gibt, z. B. -F
und -l
in grep -Fl
, da Sie sonst nichts aus der Ihnen gestellten Übung lernen, sondern lediglich eine Antwort kopieren.
Antwort2
In der zsh
Shell:
grep -l -F -i 'string' ~/**/*(.Dmm-2)
... wobei **
rekursiv in Unterverzeichnisse passt und wobei .D
in (.Dmm-2)
bedeutet „nur normale Dateien ( .
) übereinstimmen, aber versteckte Dateien ( D
) einschließen“ und wobei mm-2
„innerhalb der letzten zwei Minuten geändert“ bedeutet.