
Ich habe einen Ordner mit Dateien und muss diese mit dem Unix-Befehl „tr“ durchlaufen, wobei die Ausgabe möglichst denselben Namen wie zuvor haben muss (der folgende Code funktioniert nicht):
FILES=/root/Desktop/prova/*
for f in $FILES ; do
echo "Processing $f file..."
cat $f | tr "\n" "," > $f.tmp & mv $f.tmp $f
done
Ich verstehe nicht, wie ich diesen Befehl verwenden cat "$f" | tr "\n" "," > "$f"
und die Ausgabe jeder Datei umleiten kann. Dann sollte ich eine weitere For-Schleife verwenden, um N Tool-Befehle zu erstellen und diese zusammen auszuführen. Haben Sie Ratschläge für Schleifenstudien?
Antwort1
Das cat
ist eine nutzlose Verschwendung von CPU-Leistung, vermeiden Sie es. Senden Sie die Ausgabe stattdessen an eine temporäre Datei und benennen Sie diese Datei anschließend wieder um:
tr x y < input > input.tmp && mv input.tmp input
Wenn moreutils
es installiert ist, kann dies mit folgendem Programm erledigt werden sponge
(das die temporären Dateien im Hintergrund ausführt):
tr x y < input | sponge input
Beachten Sie, dass durch derartige Umbenennungen möglicherweise ausgefallene ACL- oder Sicherheitskontexte zerstört werden, die für die nun eindeutig entkoppelte Originaldatei festgelegt wurden input
.