Terminal: Hinzufügen von Logik zum Suchen von Verzeichnissen, die entweder [Kriterium A] oder [Kriterium B] enthalten

Ich habe ein riesiges Medienarchiv ohne einheitliches Organisationsschema geerbt. Sein Inhalt reicht mindestens 10 Jahre zurück. Ich wurde gebeten, eine Nadel in diesem Heuhaufen zu finden, und ich habe einige Vermutungen über den Namen dieser Nadel. Aber ich weiß seinen Namen nicht genau. findIch möchte einen einzigen Befehl im Terminal verwenden, um nach alternativen Namen zu suchen. Und ich möchte einen zweiten Satz hinzufügen: mögliche Dateierweiterungen. In Pseudocode meine ich Folgendes: find [in a given directory] [files and folders whose name matches (*guess1* OR *guess2*) AND whose name matches (*.extension1 OR *.extension2)]. Wie soll ich das im Terminal ausdrücken?

Antworten (4)

Sie können dies mit ls und grep mit regulären Ausdrücken tun

ls | grep -E "(guess1|guess2)(\.extension1|\.extension2)"

Oder wenn Sie rekursiv in Ordnern suchen müssen:

ls -R | grep -E "(guess1|guess2)(\.extension1|\.extension2)"
Ich unterstütze die Ermahnung von @grgarside, dass das Analysieren der Ausgabe von lsim Allgemeinen ein schlechter Ansatz ist, auch wenn dies möglicherweise die Arbeit für Sie erledigt.

Verwenden Sie den Befehl

find /dir/to/search \( -iname '*guess1*' -o -iname '*guess2*' \) \
                    \( -iname '*.extension1' -o -iname '*.extension2' \)

findarbeitet rekursiv. Verwenden Sie -maxdepth 1, um es nicht rekursiv zu machen.

-inameführt eine Dateinamenübereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung durch.

Argumente werden implizit durch AND verbunden, aber Sie können verwenden, -oum es mit OR zu machen. Klammern müssen mit einem Backslash maskiert werden, um sie vor der Shell zu schützen.

(Es könnte alles in einer Zeile geschrieben werden; hier habe ich die Zeilen mit gebrochen, \returnum die Lesbarkeit zu verbessern.)

Wenn das Volume von Spotlight indiziert wird, verwenden Sie mdfindfür schnellste Ergebnisse.

mdfind -onlyin /dir/to/search '(kMDItemFSName==*guess1* || kMDItemFSName==*guess2*)' \
                     '&& (kMDItemFSName=*.extension1 || kMDItemFSName=*.extension2)'

findist langsam. grepund andere Textsuchwerkzeuge sind viel schneller. Wenn Sie nicht glauben, dass Sie die Nadel im Heuhaufen mit dem ersten Schuss finden, ist es wahrscheinlich besser, findin eine temporäre Datei zu gehen, z. B. find . -print > /tmp/find.out, und dann in dieser Datei nach Dateinamen zu suchen, die Ihren Suchkriterien entsprechen.