GNU/Linux >> LINUX-Kenntnisse >  >> Linux

`find` mit mehreren `-name` und `-exec` führt nur die letzten Übereinstimmungen von `-name` aus?

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.


Linux
  1. $_ Gegen !$. Letztes Argument des vorhergehenden Befehls und Ausgabeumleitung?

  2. Mehrere Home-Ordner mit Dropbox und Symlinks synchronisieren?

  3. Informationen mit dem vsish-Befehl abrufen (nur esxi)

  4. So finden Sie das letzte Feld mit 'Ausschneiden'

  5. Grep in einer riesigen Logdatei (>14 GB) nur die letzten x GB?

Überwachen Sie Befehle und Aufgaben mit dem Linux-Überwachungsbefehl

Finden Sie Dateien und Verzeichnisse unter Linux mit dem Befehl find

Importieren Sie Funktionen und Variablen mit dem Quellbefehl in Bash

Navigieren in der Bash-Shell mit pushd und popd

Die Alias- und Unalias-Befehle mit Beispielen erklärt

Wie kann man die -f-Ausgabe mit Farben nur mit Awk anpassen und den Rest der Ausgabe anzeigen?