Wenn ich
verwende
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
Es findet alle Dateitypen. Aber wenn ich -exec
hinzufüge am Ende:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
es scheint, dass es nur .txt
druckt Dateien. Was mache ich falsch?
Hinweis:Verwendung von MINGW (Git Bash)
Akzeptierte Antwort:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt"
ist die Abkürzung für:
find . ( ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" ) ) -a -print
Das heißt, weil keine Aktion Prädikat angegeben ist (nur Bedingungen ), ein -print
Aktion wird implizit für die Dateien hinzugefügt, die den Bedingungen entsprechen.
(und das würde übrigens nicht reguläre .js
drucken Dateien (der -type f
gilt nur für .htm
Dateien)).
Während:
find . -type f -name "*.htm*" -o -name "*.js*" -o -name "*.txt" -exec sh -c 'echo "$0"' {} ;
ist die Abkürzung für:
find . ( -type f -a -name "*.htm*" ) -o ( -name "*.js*" ) -o ( -name "*.txt" -a -exec sh -c 'echo "$0"' {} ; )
Für find
(wie in vielen Sprachen), UND (-a
; implizit, wenn weggelassen) hat Vorrang vor OR (-o
) und Hinzufügen eines expliziten Aktionsprädikats (hier -exec
) bricht den -print
ab oben gesehene implizite Aktion. Hier möchten Sie:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" )
-exec sh -c 'echo "$0"' {} ;
Oder:
find . -type f ( -name "*.htm*" -o -name "*.js*" -o -name "*.txt" ) -exec sh -c '
for i do
echo "$i"
done' sh {} +
Um zu vermeiden, dass ein sh
ausgeführt wird pro Datei.