(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 {} ';'