Sie könnte so etwas tun (aber ich würde es überhaupt nicht empfehlen).
find dir -print0 |
xargs -0 -n 2 awk -v OFS='\0' '<process the input and write to temporary file>
END {print "temporaryfile", FILENAME}' |
xargs -0 -n 2 mv
Dies geht um die Dateien zu awk
direkt zwei zu einer Zeit (die das Problem mit Ihrem ursprünglichen vermeidet, wo cat
Hunderte (vielleicht mehr) Dateien als Argumente auf einmal und spucken alle ihren Inhalt an awk
bekommen über Standard-Input sofort und verlieren somit ihre individuellen Inhalte und Dateinamen vollständig).
Es hat dann awk
die verarbeitete Ausgabe in eine temporäre Datei zu schreiben, und gibt dann den temporären Dateinamen und den ursprünglichen Dateinamen, wo xargs
ihnen aufgreift (wieder zwei auf einmal) und läuft mv
auf den Paaren der temporären Datei/ursprüngliche Datei Namen.
Wie ich schon am Anfang sagte, ist dies jedoch ein schrecklicher Weg, dies zu tun.
Wenn Sie eine neue Version von genug GNU awk
(Version 4.1.0 oder höher), dann können Sie nur die Verwendung -i
(in-place) Argument awk
und verwenden (glaube ich):
find dir | xargs awk -i '......'
Ohne das würde ich eine while
Schleife des Formulars in Bash FAQ 001 verwenden, um die find
Ausgabe Linie-für-Linie zu lesen und auf ihr in der Schleife zu arbeiten.
Welches Problem hast du dabei? –
schreiben Sie ein Skript und übergeben Sie den Dateinamen 'find dir -exec myscript {} \;' wo myscript beginnt mit wie 'name =" $ 1 "' und das macht die Katze, die awk etc. –
'xargs cat' hier ist sinnlos (und wird nicht funktionieren, weil es Dateien kombinieren wird). 'xargs awk' wäre besser (und würde' awk' jede Datei unabhängig behandeln, einschließlich 'mv', wenn Sie wirklich wollen). –