![Brauche Hilfe mit xargs und Substitution](https://rvso.com/image/191770/Brauche%20Hilfe%20mit%20xargs%20und%20Substitution.png)
Ich habe unten einen Befehl und muss die in meinem xargs
Befehl übergebenen Parameter für meinen echo
Befehl 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 xargs
Befehl 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 find
mit 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 ...
.