GNU/Linux >> LINUX-Kenntnisse >  >> Ubuntu

Verwirrt über Grep und den Platzhalter *?

Ich führe den folgenden Befehl aus, um alle Dateien/Verzeichnisse zu finden, die nichts mit „flash_drive_data“ zu tun haben:

find . -not -path './flash_drive_data*' | grep "./*flash*"

Es gibt ein paar Dinge, die ich versucht habe, die mich verwirren:

1. Wenn ich den obigen Befehl ausführe, erhalte ich einige „teilweise“ Treffer (d. h. sie stimmen nicht vollständig mit dem *flash* überein Muster. Zum Beispiel:

./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/cli.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/signals.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/templating.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/sessions.pyi
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json
./.local/lib/python3.7/site-packages/jedi/third_party/typeshed/third_party/2and3/flask/json/tag.pyi

Die 3/flas am Ende wird hervorgehoben.

2. Als ich grep "*flash*" ersetzt habe mit nur grep "*" , habe ich erwartet, dass alle Dateien von find zurückgegeben werden, aber ich habe keine bekommen. Wieso den? Dann, als ich grep "**" gemacht habe Ich glaube, ich habe alle Dateien (oder zumindest glaube ich, dass ich es getan habe). Nochmal, warum ist das so?

3. Schließlich bestand das Ziel meiner obigen Vorgehensweise darin, sicherzustellen, dass beim Ausführen von find . -not -path './flash_drive_data*' Ich bekam nichts im Zusammenhang mit flash_drive_data. Es schien, als hätte ich es getan (mit einem unerwarteten Verhalten mit grep, wie ich oben erklärt habe). Als ich jedoch lief:
find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' +

Ich erhielt Ausgaben, darunter Dinge wie:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

also wurden flash_drive_data-Dateien eingeschlossen.

Akzeptierte Antwort:

find . -not -path './flash_drive_data*' | grep "./*flash*"

Die Sache hier ist das grep verwendet reguläre Ausdrücke, während find -path verwendet Musterübereinstimmungen im Shell-Glob-Stil. Das Sternchen hat in diesen beiden eine unterschiedliche Bedeutung.

Der reguläre Ausdruck ./*flash* entspricht dem ersten beliebigen Zeichen (. ), dann null oder mehr Schrägstriche (/* ), dann eine Literalzeichenfolge flas , dann eine beliebige Zahl (null oder mehr) von h Figuren. 3/flas stimmt damit überein (mit null mal h ), und so würde z.B. reflash (mit null mal / ).

Sie könnten einfach grep flash verwenden stattdessen, vorausgesetzt, dass es überall in der Eingabe übereinstimmt, so dass führende und nachgestellte „passt alles“-Teile unnötig sind.

Oder verwenden Sie find -path './*flash*' -and -not -path './flash_drive_data*'

Als ich grep "*flash*" ersetzt habe mit nur grep "*" , ich habe [keine Übereinstimmungen].

Da das Sternchen „jede Zahl des vorherigen Atoms“ bedeutet, ist es hier nicht wirklich gut definiert. grep interpretiert das als wörtliches Sternchen, aber eigentlich sollte es ein Fehler sein.

Als ich jedoch lief:find . -not -path './flash_drive_data*' -exec tar cfv home.tar.bz '{}' + Ich erhielt Ausgaben, darunter Dinge wie:

./flash_drive_data/index2/ask-sdk-core/dist/dispatcher/error/handler/

also flash_drive_data Dateien wurden eingeschlossen.

Beachten Sie, dass tar speichert Dateien rekursiv und die erste Ausgabe dieses find ist . für das aktuelle Verzeichnis, also wird alles gespeichert. Vielleicht möchten Sie ! -type d ein mit find um Verzeichnisse von der Ausgabe auszuschließen, oder (besser) schauen Sie sich das -exclude=PATTERN an Optionen zu tar .


Ubuntu
  1. Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

  2. Finden Sie die MAC-Adresse in Ubuntu 21.10

  3. Ausgang begrenzen und Signal 13 vermeiden?

  4. Grep für mehrere Zeichenfolgen in Dateien und dann die Dateien in der Reihenfolge ihrer Größe auflisten?

  5. Verwenden von grep und sed zum Suchen und Ersetzen einer Zeichenfolge

So finden Sie eine bestimmte Zeichenfolge oder ein bestimmtes Wort in Dateien und Verzeichnissen

Finden Sie die größten Dateien und Verzeichnisse in Linux

Wie finde/grep was zwischen String1 und String2 ist?

Finden Sie die Befehlszeile?

So finden Sie die PID und PPID eines Prozesses in Linux

Verwirrt über stdin, stdout und stderr?