So funktioniert die Option -exec in find

So funktioniert die Option -exec in find

Ich versuche, findeine Liste von Verzeichnissen auszudrucken, die andere Dateien als JPG-Bilder enthalten, aber ich glaube, dass meine Verwendung dieser -execOption nicht funktioniert. Meine Umgebung ist Cygwin Bash.

$ find ! -iname "*.JPG$" -exec dirname

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {}

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname;

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname ;

find: missing argument to `-exec'
$ find ! -iname "*.JPG$" -exec dirname {};

find: missing argument to `-exec'

Antwort1

A muss mit a oder a -execbeendet werden . Das bewirkt, dass der Befehl einmal pro gefundenem Dateinamen ausgeführt wird, während bewirkt, dass der Befehl einmal für alle Dateinamen ausgeführt wird.;+;+

Hier ist ein funktionierendes Beispiel:

find ! -iname "*.JPG" -exec dirname {} \;

Einige bemerkenswerte Unterschiede zu Ihren Versuchen:

  1. Es muss ein Abstand zwischen {}und vorhanden sein.\;
  2. Das ;muss maskiert werden, da es ein Shell-Metazeichen ist.
  3. Wie @muru in seiner Antwort betonte, -inamewird ein Glob und kein regulärer Ausdruck benötigt.

Antwort2

Versuchen:

find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u

Anmerkungen;

  • -execUm den Befehl abzuschließen , {}wird ein benötigt, um anzugeben, wohin der Dateiname gehen sollUndein Semikolon ist erforderlich. Da die Shell ein einfaches Semikolon verschlucken würde, müssen wir es maskieren, damit es an weitergegeben wird find.

  • -inamestimmt mit Globs überein, nicht mit regulären Ausdrücken. Daher ist das letzte „ $in“ "*.JPG$"wahrscheinlich nicht das, was Sie wollen.

  • Sie sagten, Sie möchten eine „Liste von Verzeichnissen, die andere Dateien als JPGs enthalten.“ Folglich habe ich hinzugefügt, -type fdamit wir sicher sein können, dass wir nur Verzeichnisse betrachten, die mindestens eine Datei enthalten.

  • Die Ergebnisse werden durchgesehen, sort -uum Duplikate zu entfernen.

Antwort3

Die Syntax:

-exec [command] ... {} ... ;
-exec [command] ... {} ... +

Da ;es Teil der Shell-Syntax ist, müssen Sie es maskieren, damit findes als Argument betrachtet wird:

find .. -exec dirname {} \;

-inameVerwendet übrigens keine regulären Ausdrücke – verwendet es einfach *.jpgohne $.


dirnameMir fällt jetzt auf, dass wir mit GNU find überhaupt nichts verwenden müssen . Stattdessen:

find ... -printf "%h\n"

verwandte Informationen