Brauche Hilfe mit xargs und Substitution

Brauche Hilfe mit xargs und Substitution

Ich habe unten einen Befehl und muss die in meinem xargsBefehl übergebenen Parameter für meinen echoBefehl verwenden, aber ich scheine es nicht richtig hinzubekommen. Wenn ich es versuche:

find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w {})";

Wie Sie sehen, wc -w {}funktioniert das in meinem xargsBefehl nicht, es behandelt es als Literal. Und wenn ich es versuche:

find . -maxdepth 1 -type f -wholename "$1" | xargs -I{} echo -e "<h2>Filename: {}</h2>\n<pre> `cat *`\n</pre>\n<br>
Word Count $(wc -w ${})";

Es wird mir ${}eine Fehlermeldung angezeigt ... Ich weiß, dass es wahrscheinlich an der Analyse liegt, aber ich habe keine Ahnung, wie ich das beheben kann. Kann mir jemand helfen?

Antwort1

Schreiben Sie ein weiteres einfaches Skript, um die gewünschte Ausgabe zu erzeugen, und führen Sie es findmit aus -exec, ohne dass Sie benötigen xargs. Beispiel:

find . -maxdepth 1 -type f -wholename "$1" -exec /path/to/myscript.sh {} +

meinscript.sh:

#!/bin/sh

for i in "$@"; do
  printf "<h2>Filename: %s</h2>\n<pre>" "$i"
  cat *
  printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")"
done

Speichern Sie dies und machen Sie es ausführbar, indem Sie ausführen chmod +x myscript.sh.

Ich weiß nicht, warum Sie für jede gefundene Datei ausführen möchten cat *(also alle Dateien im aktuellen Verzeichnis cat), aber das ist, was Sie verlangt haben. Sind Sie sicher, dass Sie nicht stattdessen den Inhalt jeder einzelnen Datei haben möchten? Verwenden Sie cat "$i"anstelle von cat *.

Alternativ können Sie es ohne zusätzliches Skript tun, indem Sie -exec sh -c ...stattdessen Folgendes verwenden:

find . -maxdepth 1 -type f -wholename "$1" \
  -exec sh -c 'for i in "$@"; do
          printf "<h2>Filename: %s</h2>\n<pre>" "$i";
          cat "$i";
          printf "\n<pre>\n<br>Word Count %s\n" "$(wc -w "$i")";
        done' find-sh {} +

(zusätzliche Zeilenumbrüche zur Verbesserung der Lesbarkeit hinzugefügt. Das Skript funktioniert mit oder ohne sie gleich.)

Übrigens, wenn Sie ein Skript ausführen müssen, das nur Bash-Funktionen verwendet, verwenden Sie -exec bash -c ...anstelle von -exec sh -c ....

verwandte Informationen