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.