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

Ausführen einer benutzerdefinierten Funktion in einem Find -exec-Aufruf?

Ich verwende Solaris 10 und habe Folgendes mit ksh (88), bash (3.00) und zsh (4.2.1) getestet.

Der folgende Code liefert kein Ergebnis:

function foo {
    echo "Hello World"
}

find somedir -exec foo ;

Die Suche stimmt mit mehreren Dateien überein (wie durch Ersetzen von -exec ... gezeigt wird). mit -print ), und die Funktion funktioniert perfekt, wenn sie außerhalb von find aufgerufen wird anrufen.

Hier ist, was der man find findet Seite sagen über -exec :

 -exec command       True if the executed command  returns  a
                     zero  value  as  exit status. The end of
                     command must be punctuated by an escaped
                     semicolon (;).  A command argument {} is
                     replaced by the current pathname. If the
                     last  argument  to  -exec  is {} and you
                     specify + rather than the semicolon (;),
                     the command is invoked fewer times, with
                     {} replaced by groups of  pathnames.  If
                     any  invocation of the command returns a
                     non-zero  value  as  exit  status,  find
                     returns a non-zero exit status.

Ich könnte wahrscheinlich davonkommen, so etwas zu tun:

for f in $(find somedir); do
    foo
done

Aber ich habe Angst, mich mit Feldtrennzeichen auseinanderzusetzen.

Ist es möglich, eine Shell-Funktion (definiert im selben Skript, kümmern wir uns nicht um Bereichsprobleme) von einem find ... -exec ... anrufen?

Ich habe es sowohl mit /usr/bin/find versucht und /bin/find und bekam das gleiche Ergebnis.

Akzeptierte Antwort:

Eine function ist lokal für eine Shell, also brauchen Sie find -exec um eine Shell zu erzeugen und diese Funktion in dieser Shell zu definieren, bevor Sie sie verwenden können. Etwas wie:

find ... -exec ksh -c '
  function foo {
    echo blan: "[email protected]"
  }
  foo "[email protected]"' ksh {} +

bash ermöglicht es, Funktionen über die Umgebung mit export -f zu exportieren , also können Sie (in bash) Folgendes tun:

foo() { ...; }
export -f foo
find ... -exec bash -c 'foo "[email protected]"' bash {} +

ksh88 hat typeset -fx to export-Funktion (nicht über die Umgebung), aber das kann nur von she-bang less-Skripten verwendet werden, die von ksh ausgeführt werden , also nicht mit ksh -c .

Eine weitere Option ist:

find ... -exec ksh -c "
  $(typeset -f foo)"'
  foo "[email protected]"' ksh {} +

Verwenden Sie also typeset -f um die Definition von foo auszugeben Funktion innerhalb des Inline-Skripts. Beachten Sie, dass wenn foo andere Funktionen verwendet, müssen Sie diese ebenfalls ausgeben.

Verwandt:Akzent -Bedeutung finden- Dictionary Lookup!
Linux
  1. So finden Sie alle Sudo-Benutzer in Linux

  2. Suchen -exec + Vs Finden | Xargs:Welche soll man wählen?

  3. Ist Rsync ~/foo Target/foo dasselbe wie Rsync ~/foo/Target/foo/?

  4. Die Funktion von User Group Root??

  5. Die Option -exec in Find zum Laufen bringen?

Linux-Fingerbefehl zum Suchen von Benutzerdetails

Finden Sie Benutzerkonten mit leerem Passwort in Linux

So ermitteln Sie die Benutzerspeichernutzung in Linux

Rufen Sie eine C-Funktion aus C++-Code auf

Manipulation der Bash-Funktion erklärt

Rufen Sie die unten deklarierte Funktion auf