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. find
Ich 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?
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)"
Verwenden Sie den Befehl
find /dir/to/search \( -iname '*guess1*' -o -iname '*guess2*' \) \
\( -iname '*.extension1' -o -iname '*.extension2' \)
find
arbeitet rekursiv. Verwenden Sie -maxdepth 1
, um es nicht rekursiv zu machen.
-iname
führt eine Dateinamenübereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung durch.
Argumente werden implizit durch AND verbunden, aber Sie können verwenden, -o
um 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 mdfind
für schnellste Ergebnisse.
mdfind -onlyin /dir/to/search '(kMDItemFSName==*guess1* || kMDItemFSName==*guess2*)' \
'&& (kMDItemFSName=*.extension1 || kMDItemFSName=*.extension2)'
find
ist langsam. grep
und andere Textsuchwerkzeuge sind viel schneller. Wenn Sie nicht glauben, dass Sie die Nadel im Heuhaufen mit dem ersten Schuss finden, ist es wahrscheinlich besser, find
in 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.
grg
200_Erfolg
ls
im Allgemeinen ein schlechter Ansatz ist, auch wenn dies möglicherweise die Arbeit für Sie erledigt.