Find/Problembehebung

Aus Foxwiki

Problembehebung

Find ohne Ende

Wenn die Suche mit find läuft und viel zu viele Ergebnisse ausspuckt und nicht aufhören will, so bricht man find mit Strg + C ab.

Pfad muss vor Suchkriterium stehen

Wenn man den Stern *</nowiki> nicht maskiert kommt es oft zu folgender Meldung: find /tmp -name *sh find: Der Pfad muß vor dem Suchkriterium stehen: adhoc.sh Aufruf: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [Pfad...] [Suchkriterium]

  • Mit find /tmp -name "*sh"
  • ist das leicht geheilt.
Seltsame Größen

Bei der Suche nach Dateigrößen kann man leicht verzweifeln, wenn man nicht dahinter kommt, dass die Vorgabemaßeinheit Blöcke zu 512 Bytes sind. find -size 200c

  • sucht nach Größen, die man vom Dezimalsystem her erwartet.

Seltsames Nichtfinden bei Größen wie k, M, G

Sucht man nach Dateien, die kleiner sind als 1000k, so werden Dateien bis maximal 999k gefunden: find -size -1000k

  • Das klingt zunächst plausibel, aber es wird keine Datei gefunden, die 999001 Bytes groß ist, denn es wird erst aufgerundet (auf 1000k) und dann verglichen (nicht kleiner als 1000k).
  • Krasser noch, wenn man Dateien bis 1M suchen wollte - selbst 1 Byte ist größer als die nächstkleinere Ganzzahl in dieser Maßeinheit, also größer als 0M, und wird daher nicht gefunden.
Kombination von UND und ODER

Bei der Kombination von mehreren Optionen mit UND und ODER helfen Klammern Fehler zu vermeiden.

Positionssensitiv

Bei mehreren Optionen und Ausdrücken (options und expressions) unterscheiden sich erstere von zweiteren dadurch, dass Optionen nicht mit 'ODER' gruppiert werden können - die Optionen werden immer für die ganze Suche verwendet.

  • Stehen die Optionen hinter Ausdrücken, so sieht das aus, als habe der User eine andere Absicht gehabt, und man bekommt eine Warnung:
  • Folgende Meldung erhält man, wenn man Optionen nach Argumenten benutzt. find tmp -name "a" -maxdepth 3 -mindepth 3 find: Warnung: Sie haben die Option `-maxdepth` nach dem Argument -name angegeben, aber Optionen sind nicht positionssensitiv (`-maxdepth` beeinträchtigt sowohl Tests, die vor ihr als auch nach ihr definiert sind). Diese Optionen ist vor den anderen Argumenten anzugeben.
  • Provozieren kann man die Warnung etwa so: find ./suchverzeichnis -maxdepth 4 -name foo -or -maxdepth 2
Xargs und Schleifen

Oft findet man Konstruktionen mit find ... xargs oder Shellschleifen die find bemühen.

  • Fast immer lässt sich das Problem durch eine der Aktionen (-okdir, -execdir, ...) eleganter lösen.
Aktion -delete an falscher Stelle

So löscht zum Beispiel der folgende Aufruf den kompletten Inhalt des Ordners /home/otto/: find /home/otto/ -delete -name Cache

Common “Gotcha”

If the given expression to find does not contain any of the “action” primaries ‑exec, ‑ok, or ‑print, the given expression is effectively replaced by: find \( expression \) -print

  • The implied parenthesis can cause unexpected results. For example, consider these two similar commands: find -name tmp -prune -o -name \*.txt ./bin/data/secret.txt ./tmp ./missingEOL.txt ./public_html/graphics/README.txt ./datafile.txt find -name tmp -prune -o -name \*.txt -print ./bin/data/secret.txt ./missingEOL.txt ./public_html/graphics/README.txt ./datafile.txt
  • The lack of an action in the first command means it is equivalent to: find . \( -name tmp -prune -o -name \*.txt \) -print
  • This causes tmp to be included in the output. However for the second find command the normal rules of Boolean operator precedence apply, so the pruned directory does not appear in the output.
  • A related issue is the precedence of the Boolean operators. OR has lower precedence than AND, and NOT has the highest precedence. When in any doubt, add parenthesis to your expressions.
  • The find command can be amazingly useful. See the man page to learn all the criteria and actions you can use.
-regex

I'm having trouble using the regex of the find command. Probably something I don't understand about escaping on the command line.

  • Why are these not the same?
find -regex '.*[1234567890]'
find -regex '.*digit:'
  • Regular expressions with character classes (e.g. digit:</nowiki>) are not supported in the default regular expression syntax used by find.
  • You need to specify a different regex type such as posix-extended in order to use them.
  • Take a look at GNU Find's Regular Expression documentation which shows you all the regex types and what they support.
  • I have some images named with generated uuid1 string.
  • For example 81397018-b84a-11e0-9d2a-001b77dc0bed.jpg.
  • I want to find out all these images using "find" command: find . -regex "[a-f0-9\-]\{36\}\.jpg".
  • But it doesn't work. Something wrong with the regex? Could someone help me with this? find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
  • Note that you need to specify .*/ in the beginning because find matches the whole path.
Beispiel
$ find . -name "*.jpg"
./foo-111.jpg ./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
$ find . -regextype sed -regex ".*/[a-f0-9\-]\{36\}\.jpg"
./test/81397018-b84a-11e0-9d2a-001b77dc0bed.jpg ./81397018-b84a-11e0-9d2a-001b77dc0bed.jpg
$ find . -regextype foo -regex ".*/[a-f0-9\-]\{36\}\.jpg"
find: Unknown regular expression type `foo'; valid types are `findutils-default', `awk', `egrep', `ed', `emacs', `gnu-awk', `grep', `posix-awk', `posix-basic', `posix-egrep', `posix-extended', `posix-minimal-basic', `sed'.

Siehe auch