
Ich versuche, find
eine Liste von Verzeichnissen auszudrucken, die andere Dateien als JPG-Bilder enthalten, aber ich glaube, dass meine Verwendung dieser -exec
Option 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 -exec
beendet 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:
- Es muss ein Abstand zwischen
{}
und vorhanden sein.\;
- Das
;
muss maskiert werden, da es ein Shell-Metazeichen ist. - Wie @muru in seiner Antwort betonte,
-iname
wird ein Glob und kein regulärer Ausdruck benötigt.
Antwort2
Versuchen:
find -type f ! -iname "*.JPG" -exec dirname {} \; | sort -u
Anmerkungen;
-exec
Um 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 wirdfind
.-iname
stimmt 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 f
damit wir sicher sein können, dass wir nur Verzeichnisse betrachten, die mindestens eine Datei enthalten.Die Ergebnisse werden durchgesehen,
sort -u
um Duplikate zu entfernen.
Antwort3
Die Syntax:
-exec [command] ... {} ... ;
-exec [command] ... {} ... +
Da ;
es Teil der Shell-Syntax ist, müssen Sie es maskieren, damit find
es als Argument betrachtet wird:
find .. -exec dirname {} \;
-iname
Verwendet übrigens keine regulären Ausdrücke – verwendet es einfach *.jpg
ohne $
.
dirname
Mir fällt jetzt auf, dass wir mit GNU find überhaupt nichts verwenden müssen . Stattdessen:
find ... -printf "%h\n"