Wie kann ich feststellen, ob verschiedene Befehle mit grep, find und xargs dasselbe bewirken?

Wie kann ich feststellen, ob verschiedene Befehle mit grep, find und xargs dasselbe bewirken?

Bewirken diese drei Befehle dasselbe?

  • Ein Befehl, der grep verwendet.

    grep "a" -r .
    
  • Ein Befehl, der find verwendet.

    find .  -exec grep "a" {} \;
    
  • Ein Befehl, der bei einer Suche über xargs ein grep verwendet.

    find . | xargs grep "a"
    

Antwort1

Sie sind nicht gleich und jeder hat Probleme.

  • Das erste ist nicht portierbar, da es eine GNU-Erweiterung verwendet. Darüber hinaus werden Optionen vor dem Muster erwartet, nicht danach.
  • Beim zweiten wird, wie bereits erwähnt, der Dateiname nicht angezeigt.
  • Der dritte Versuch schlägt fehl, wenn die Dateinamen eingebettete Leerzeichen oder ähnliches enthalten.

Ich würde stattdessen verwenden:

find .  -type f -exec grep a /dev/null {} +

Es ist portabel, ignoriert nicht reguläre Dateien, kollidiert nicht mit ungewöhnlichen Dateinamen und zeigt immer Dateinamen an, wenn das Muster gefunden wird.

Antwort2

Ist das eine Hausaufgabe?

Hast du sie probiert?

Sie machen leicht unterschiedliche Dinge.

Wenn Sie beispielsweise grepeinen einzelnen Dateinamen eingeben, wird dieser in der Ausgabe nicht wiedergegeben. Dies kann bei der Verwendung grepmit frustrierend sein find.

Antwort3

Sie sollten „dasselbe tun“ besser definieren. Der erste führt einen Befehl aus, der zweite führt einen Find-Befehl und Fork+Execs Grep einmal pro gefundener Datei aus, und der dritte führt mindestens drei Befehle aus – oder mehr, wenn zu viele Dateien gefunden werden, um in eine Befehlszeile zu passen. Was die CPU-/Speicherauswirkungen angeht, tun sie dies am deutlichsten.nichttun Sie dasselbe – der Unterschied zwischen einem, drei und „einer ganzen Reihe“ von Prozessen ist erheblich.

Aus Sicht des Dateisystems wird das Dateisystem durchlaufen, jede Datei wird stat'd und dann geöffnet, vollständig gelesen und geschlossen. Aus dieser Perspektive machen sie also alle dasselbe, und das Dateisystem bemerkt keinen Unterschied (abgesehen von vielleicht langsamerer Durchquerung im zweiten Fall aufgrund des Overheads durch das Aufspalten einer Unmenge von Prozessen).

Die auf dem Bildschirm generierte Ausgabe ist unterschiedlich und dieser Unterschied kann empirisch ermittelt werden, indem man die Befehle einfach mit ein paar unterschiedlichen möglichen Verzeichnisstrukturen ausführt (eine offensichtliche Möglichkeit ist die, die redgrittybrick erwähnt hat).

Aufgrund der Anzahl der unterschiedlichen Zeichen und der Möglichkeit von Syntaxfehlern ist der Zeitaufwand für die Eingabe unterschiedlich.

Und so weiter. Es gibt viele Möglichkeiten, wie sich die Dinge „unterscheiden“ können. :)

verwandte Informationen