tr-Befehl für mehrere Dateien

T

turalu

Grünschnabel
Hallo,

vielleicht könnt Ihr mir als Linux-Einsteigerin weiterhelfen:
Ich möchte in mehreren Dateien alle carriage returns löschen. Dazu habe ich folgenden Befehl gefunden:

tr -d '\r' < infile.csv > outfile.csv

Funktioniert mit einer Datei auch prima. Nun will ich den Befehl aber für alle Dateien eines Verzeichnisses ausführen. Kann mir jemand weiterhelfen?

Danke schonmal!
turalu
 
So:

Code:
for datei in *; do  tr -d '\r' < "$datei".csv > "$datei".csv ; done

Gruß Aqualung
 
Danke für den Tipp. Zuerst kam die Meldung: ...V40.csv.csv: no such file or directory
Also habe ich das '.csv' weggelassen. Dann kam keine Fehlermeldung, aber die Dateien waren hinterher leer. Das Phänomen habe ich schonmal beobachtet, wenn input-Datei=output-Datei war. Ich vermute also, es würde funktionieren, wenn ich die Dateien erst unter anderem Namen speichere, dann die alten lösche und die neuen umbenenne. Leider ist mir die Syntax von deinem Einzeiler nicht ganz klar, deshalb kann ich das nicht ändern: Was hat das mit dem " und $ auf sich?
Wäre nett, wenn du mir noch einen Hinweis geben könntest. Evtl. auch in welchem Buch (oder auf welcher Homepage) man sowas nachlesen kann.
Danke!
turalu
 
Das hier

Code:
for datei in *; do  tr -d '\r' < "$datei".csv > "$datei".csv ; done

war nicht korrekt. Denn wenn in- und outfile gleich heißen ist das Resultat eine leere Datei :))
$ bezeichnet den INHALT einer Variablen, hier datei.
Lieber so:

Code:
for datei in *; do  tr -d '\r' < $datei > $datei.new ; done

Die " brauchst Du nur in dem Fall, dass Deine Dateinamen Leerzeichen enthalten.

Gruß Aqualung
 
Zuletzt bearbeitet:
Es kommt zwar die Meldung '$datei: ambiguous redirect', aber es scheint trotzdem zu funktionieren. Zum Löschen und umbenennen habe ich es folgendermassen erweitert:

for datei in *.csv ; do rm $datei; done #löschen
for datei in *.csv.new; do mv $datei ${datei%..new}; done #umbenennen

Ist wahrscheinlich nicht besonders elegant, aber egal :-)
Danke Dir, Aqualung!

turalu
 
Hallo,

geht es um Zeilenumbrüche am Ende einer Zeile, wie sie manchmal bei Datenübertragungen vorkommen? Und wie wäre es mal wieder mit sed dafür?

Im Verzeichnis mit den Dateien:
Code:
sed -i -e 's/\(\r\)//' *.csv
Könnte das schon reichen? Mit -i schreibt man direkt in der Datei herum und die ist danach nicht leer...

Wenn ich diverse DOS-Dateien in ein Verzeichnis kopiere und diesen Befehl drüber bügel (dann mit *.* natürlich weil nicht .csv ..), sind die \r anschließend überall weg..

[Edit]
Das "-e" kann auch weg... also sed -i 's/\(\r\)//' *.csv
 
Zuletzt bearbeitet:
geht es um Zeilenumbrüche am Ende einer Zeile, wie sie manchmal bei Datenübertragungen vorkommen?
[...]
Wenn ich diverse DOS-Dateien in ein Verzeichnis kopiere und diesen Befehl drüber bügel (dann mit *.* natürlich weil nicht .csv ..), sind die \r anschließend überall weg..

Dafür gibts doch auch die Programmen 'dos2unix' und 'unix2dos'.
 
Hall Jens,

danke für den Hinweis, der tr-Befehl schien mir einfacher, ich hatte es auch schon mit sed probiert, aber da hatte ich ebenfalls das Problem, dass die Datei leer war, und dass ich nicht wusste, wie ich das für alle dateien eines Verzeichnisses machen kann.

Wenn ich dich richtig verstanden habe, kann man das Problem mit den leeren Dateien mit der -i-Option beheben, allerdings kommt da bei mir die Meldung:
'illegal option -- i'
Weisst du, woher das kommt?
Ich arbeite vom PC aus über Xwindow auf einer Solaris Maschine.

Grüße,
Barbara
 

Ähnliche Themen

Verzeichnis mit 1200 Dateien auf Verweise in Textdateien checken

chown Befehl in einem Script

rsync Übertragung von Dateien zwischen zwei Servern

Samba Server funktioniert nach Installation von Nextcloud 26 nicht mehr

Hilfe für ein shell script

Zurück
Oben