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

Pipelined Sed funktioniert nicht bei gefundenem Dateinamen innerhalb der Bash-Befehlsersetzung, wenn er von Find „-exec“ aufgerufen wird?

Für diese Frage gibt es hier bereits Antworten :if command in find -exec

(2 Antworten)
Vor 11 Monaten geschlossen.

Es sieht so aus, als ob „find“, „bash“ und „sed“ in einigen Fällen nicht wie erwartet funktionieren.

Das folgende Beispiel sollte zuerst die Datei „sample.txt“ erstellen, dann die Datei finden und schließlich mit dem Befehl „-exec“ verarbeiten. Der ausgeführte Befehl gibt den gefundenen Dateinamen, die Testmuster und den geänderten Dateinamen aus. Der Befehl „sed“ selbst wird verwendet, um „txt“ durch „TXT“ zu ersetzen.

touch sample.txt
find ./ -maxdepth 1 -name "*.txt" -exec echo {} $(echo Specimen_before.txt {} Specimen_after.txt |sed -e "s/txt/TXT/g") ;

Die erwartete Ausgabe ist:

./probe.txt Probe_vorher.TXT ./probe.TXT Probe_nachher.TXT

Stattdessen erzeugt es:

./probe.txt Probe_vorher.TXT ./probe.txt Probe_nachher.TXT

(Das Beispiel wurde auch mit der Old-School-Befehlsersetzung durch Backquotes „`“ mit dem gleichen Ergebnis getestet)

Was mache ich falsch?

Akzeptierte Antwort:

Die Befehlsersetzung wird vor find ausgeführt fängt sogar an. Der tatsächlich ausgeführte Befehl (nach Ersetzungen, Erweiterungen und Zitatentfernungen usw.) ist

find ./ -maxdepth 1 -name *.txt -exec echo {} Specimen_before.TXT {} Specimen_after.TXT ;

Wenn Sie alles ausführen müssen ausgefallen (Pipes oder mehrere Befehle) mit -exec , und starten Sie dann eine separate Shell, um dies zu tun:

find . -maxdepth 1 -type f -name '*.txt' 
    -exec sh -c 'printf "%s " "$1"; printf "%s %s %sn" "before.txt" "$1" "after.txt" | sed "s/txt/TXT/g"' sh {} ';'

Linux
  1. Befehl nicht in Bash gefunden behoben

  2. Warum funktioniert die automatische Vervollständigung nicht, wenn ein Befehlsname nach „Quelle“ eingegeben wird?

  3. Befehl nicht in Zsh, aber in Bash gefunden?

  4. bash:netstat:Befehl nicht gefunden.

  5. bash sh - Befehl nicht gefunden

Fehlerbehebung „Bash:Command Not Found“-Fehler in Linux

Warum funktioniert find -exec mv {} ./target/ + nicht?

Das Bash-Skript gibt „Command Not Found“ in leeren Zeilen aus

GLIBCXX_3.4.9 nicht gefunden, wenn ffmpeg von PHP auf dem Lampp-Server ausgeführt wird

gdb trifft keine Breakpoints, wenn ich es aus dem Docker-Container heraus starte

Was ist -bash:!:Ereignis nicht gefunden