629 Stimmen

find -exec mit mehreren Befehlen

Ich versuche, find -exec mit mehreren Befehlen zu verwenden, ohne Erfolg. Weiß jemand, ob Befehle wie die folgenden möglich sind?

find *.txt -exec echo "$(tail -1 '{}'),$(ls '{}')" \;

Im Grunde versuche ich, die letzte Zeile jeder txt-Datei im aktuellen Verzeichnis zu drucken und am Ende der Zeile ein Komma gefolgt vom Dateinamen zu drucken.

934voto

Tinker Punkte 8540

find akzeptiert mehrere -exec Teile des Befehls. Zum Beispiel:

find . -name "*.txt" -exec echo {} \; -exec grep banana {} \;

Beachten Sie, dass in diesem Fall der zweite Befehl nur ausgeführt wird, wenn der erste Befehl erfolgreich zurückkehrt, wie von @Caleb erwähnt. Wenn Sie möchten, dass beide Befehle unabhängig von ihrem Erfolg oder Misserfolg ausgeführt werden, können Sie dieses Konstrukt verwenden:

find . -name "*.txt" \( -exec echo {} \; -o -exec true \; \) -exec grep banana {} \;

146voto

Avari Punkte 1349
find . -type d -exec sh -c "echo -n {}; echo -n ' x '; echo {}" \;

75voto

Dennis Williamson Punkte 322329

Einen der folgenden Punkte:

find *.txt -exec awk 'END {print $0 "," FILENAME}' {} \;

find *.txt -exec sh -c 'echo "$(tail -n 1 "$1"),$1"' _ {} \;

find *.txt -exec sh -c 'echo "$(sed -n "\$p" "$1"),$1"' _ {} \;

35voto

al3x2ndru Punkte 588

Eine andere Möglichkeit ist die folgende:

multiple_cmd() { 
    tail -n1 $1; 
    ls $1 
}; 
export -f multiple_cmd; 
find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;

in einer Zeile

multiple_cmd() { tail -1 $1; ls $1 }; export -f multiple_cmd; find *.txt -exec bash -c 'multiple_cmd "$0"' {} \;
  • " multiple_cmd() " - ist eine Funktion
  • " export -f multiple_cmd " - exportiert sie, damit jede andere Subshell sie sehen kann
  • " find *.txt -exec bash -c 'multiple_cmd "$0"' {} \; " - find, der die Funktion in Ihrem Beispiel ausführen wird

Auf diese Weise kann multiple_cmd so lang und so komplex sein, wie Sie es brauchen.

Ich hoffe, das hilft.

24voto

Camilo Martin Punkte 35643

Es gibt einen einfacheren Weg:

find ... | while read -r file; do
    echo "look at my $file, my $file is amazing";
done

Alternativ dazu:

while read -r file; do
    echo "look at my $file, my $file is amazing";
done <<< "$(find ...)"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X