2012-07-02 13 views
6

Ich habe eine Reihe von XML-Dateien in einem Verzeichnis, in denen der Befehl dos2unix ausgeführt werden muss und neue Dateien werden so oft hinzugefügt. I Anstatt den Befehl dos2unix manuell für jede Datei auszuführen, möchte ich alles mit einem Skript automatisieren. Ich habe noch nie an einem Shell-Skript in meinem Leben gesucht, aber bisher habe ich diese von dem, was ich auf ein paar Tutorials gelesen haben:Wie man Dos2unix mit Shell-Skript automatisieren?

FILES=/tmp/testFiles/* 
for f in $FILES 
do 
    fname=`basename $f` 
    dos2unix *.xml $f $fname 
done 

Allerdings halte ich immer die ‚Nutzung‘ Ausgabe zeigt nach oben. Ich denke das Problem ist, dass ich den Namen der neuen Datei nicht korrekt (fname) zuweisen werde. Kann jemand helfen.

Danke, Alan

Antwort

6

Der Grund, warum Sie eine Verwendungsnachricht erhalten, ist, dass dos2unix die zusätzlichen Argumente nicht übernimmt, die Sie liefern. Es akzeptiert jedoch mehrere Dateinamen (auch über Globs). Sie benötigen keine Schleife, es sei denn, Sie verarbeiten mehr Dateien, als in der Befehlszeile akzeptiert werden können.

dos2unix /tmp/testFiles/*.xml 

Sollte alles, was Sie brauchen, wenn Sie Rekursion benötigen:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

(für GNU finden)

1
mkdir /tmp/testFiles/converted/ 
for f in /tmp/testFiles/*.xml 
do 
    fname=`basename $f` 
    dos2unix $f ${f/testFiles\//testFiles\/converted\/} 
    # or for pure sh: 
    # dos2unix $f $(echo $f | sed [email protected]/@testFiles/converted/@) 
done 

Das Ergebnis wird im converted/ Unterverzeichnis gespeichert werden.

Der Bau ${f/testFiles\//testFiles\/converted\/} (dank Eile) oder sed hier verwendet wird converted/ vor dem Namen der Datei hinzuzufügen:

$ echo /tmp/testFiles/1.xml | sed [email protected]/@testFiles/converted/@ 
/tmp/testFiles/converted/1.xml 
+0

Vielen Dank, aber können Sie erklären, was das bedeutet: "$ (echo f $ | sed s @ testfiles/@ testfiles/konvertiert /)" Edit: Dieser Befehl funktioniert nicht. Fehler: sed: Befehl verstümmelt: s @ testFiles/@ testFiles/konvertiert /, das Entfernen der sed-Befehl gibt Fehler: COuld nicht öffnen Eingabedatei FILES –

+0

Ich füge einfach 'konvertiert /' vor diesem Namen der Datei. –

+2

Sie brauchen nicht 'sed' dafür. Sie können es mit '$ {f/testFiles \ // testFiles \/converted \ /}' – rush

2

Wenn alle Dateien in einem Verzeichnis (keine Rekursion erforderlich), dann sind Du bist fast da.

for file in /tmp/testFiles/*.xml ; do 
    dos2unix "$file" 
done 

standardmäßig dos2unix sollte anstelle konvertieren und das Original überschreiben.

Wenn Rekursion benötigt wird, Sie haben find als auch verwenden:

find /tmp/testFiles -name '*.xml' -print0 | while IFS= read -d '' file ; do 
    dos2unix "$file" 
done 

, die auf alle Dateien mit .xml in /tmp/testFiles/ und alle seine Unterverzeichnisse endet arbeiten.

Wenn kein anderer Schritt erforderlich Sie die Shell-Schleife ganz überspringen können:

Nicht-rekursive:

find /tmp/testFiles -maxdepth 1 -name '*.xml' -exec dos2unix {} + 

Und für rekursive:

find /tmp/testFiles -name '*.xml' -exec dos2unix {} + 

In Ihrem ursprünglichen Befehl, den ich sehe Sie finden den Basisnamen jedes Dateinamens und versuchen, diesen an dos2unix weiterzuleiten, aber Ihre Absicht ist nicht klar. Später, in einem Kommentar, sagen Sie, Sie wollen nur die Dateien überschreiben. Meine Lösung führt die Konvertierung durch, erstellt keine Sicherungen und überschreibt das Original mit der konvertierten Version. Ich hoffe, das war deine Absicht.

+1

Er speichert nicht die Ergebnisse eines erweiterten Globs. Der Glob wird bei der Zuweisung nicht erweitert. –

+0

@DennisWilliamson: Ich sehe, dass Sie Recht haben. Ich habe diesen Kommentar entfernt, danke für die Korrektur. – Sorpigal

0

Es ist nicht klar, welche Implementierung von dos2unix Sie verwenden. Unterschiedliche Implementierungen erfordern unterschiedliche Argumente. Es gibt viele verschiedene Implementierungen.

Auf RedHat/Fedora/Suse Linux könnten Sie einfach

geben
dos2unix /tmp/testFiles/*.xml 

Auf SunOS sind Sie verpflichtet, ein Ein- und Ausgabedateinamen und der obige Befehl würde zerstören mehr Ihre Dateien zu geben.

Welche Version verwenden Sie?

Grüßen, Erwin