2016-10-20 2 views
0

Ich habe diesen Befehl find, um alle Dateien in den letzten 50 Sekunden geändert zu bekommen, die mit dem folgenden Regex hell\d in den letzten 1000 Zeichen übereinstimmen. Ich verwende Tail, um die letzten 1000 Zeichen zu erhalten, um die Suche zu beschleunigen, da die zu überprüfenden Dateien riesig sind (durchschnittlich 3 GB).Wie zwei Befehle in -exec-Parameter von find kombinieren?

find /home/ouhma -newermt '50 seconds' -type f | 
while read fic; do 
    if tail -c 1000 "${fic}" | LANG=C LC_ALL=C grep -Pq 'hell\d'; then 
     echo "${fic}" 
    fi 
done 

Es ist posible -exec Parameter zu verwenden, die hässliche Schleife zu ersetzen und das Ergebnis noch schneller abrufen?

Dies funktioniert, aber ich weiß nicht, ob es der beste Weg, es zu tun:

find /home/ouhma -newermt '50 seconds' -type f -exec bash -c 'LANG=C LC_ALL=C grep -Pq "hell\d" <(tail -c 1000 "{}") && echo "{}"' \; 

Antwort

1

Mehrere -exec Aktionen ein anderes folgen können, ein -exec wird ausgeführt werden, wenn die vorherigen -exec dh des Fahrbefehls erfolgreich durch -exec kehrt Exit-Status 0

Do:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1")' _ {} \; -exec echo {} \; 

Wie Sie gerade Druck sind der Dateiname, wäre dies allerdings genügen:

find /home/ouhma -type f -newermt '50 seconds' -exec env LC_ALL=C \ 
     bash -c 'grep -Pq "hell\d" <(tail -c 1000 "$1") && echo "$1"' _ {} \; 
+0

Wenn ich Ihren Befehl auf diese Weise testen: 'finden /home/ouhma/hello.txt -exec LC_ALL = C grep -pq 'Hölle \ d' <(tail -c 1000 {}) \; -exec echo {} \; ' Es gibt den folgenden Fehler zurück: ' tail: kann '{}' zum Lesen nicht öffnen: Keine solche Datei oder Verzeichnis finden: 'LC_ALL = C': Keine solche Datei oder Verzeichnis ' – harrison4

+0

@ Ouhma Überprüfen Sie meine Änderungen. – heemayl

+0

Das Erzeugen eines "Bash" für jede Datei ist nicht schneller als der Versuch von OP. – anubhava