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
.