2009-06-03 6 views
0

Unter Ubuntu habe ich eine Reihe von Dateien in einem Baum namens 'output.txt'. Für jede Datei möchte ich die Zeilen alphabetisch nach 'sortieren' sortieren. Ich dachteSo sortieren Sie eine Reihe von Dateien alphabetisch, rekursiv

finden. -name output.txt -exec sort {} \;

aber dies gibt die sortierten Zeilen an die Konsole, anstatt die ursprünglichen Dateien zu aktualisieren, was ich will.

Antwort

3
find . -name output.txt -exec sort{} -o{} \; 
+0

Sieht aus wie es funktioniert (wird eine Weile dauern, kann also nicht sicher sein). Ich hätte schwören können, dass ich etwas ähnliches versucht habe (ist das nicht immer so?) Wie auch immer du rockest. –

+0

Können Sie wirklich verwenden, um dieselbe Ausgabedatei wie die Eingabedatei zu verwenden? Ich bezweifle das. – lothar

+0

@lothar was auch immer Sie bezweifeln, es wird immer noch funktionieren: -p das Sortierprogramm liest die ganze Datei, sortiert die Zeilen im Speicher und schreibt dann die Ausgabe – fortran

-1

Ich habe Linux nicht viel benutzt, also könnte ich mich irren, aber sollten Sie das nicht mit StdOut kontrollieren können?

find . -name output.txt -exec sort{} \ > output.txt 
+0

Das obige erzeugt alle sortierten Zeilen in einer einzigen Datei, nicht sortieren jede Datei. – kbyrd

+0

würde 'sort -o' dir hier nicht helfen? – kbyrd

0

Versuchen Sie, diese

csh <enter> 

foreach i (`find . -type f -name output.txt -print`) <enter> 
    cat $i | sort > $.sorted <enter> 
end <enter> 

Sie eine sortierte Kopie der Datei generieren.

+0

ist jetzt korrekt. Die vorherige Version erzeugt nur EINE Datei mit allen Zeilen zusammen. Es tut uns leid. – Luixv

1

Fortran,

ich es tun würde ein wenig anders, würde ich die Datei nicht in sich selbst sortieren. Nur wenn neue Dateien zu den Dateien nach der Sortierung hinzugefügt werden. hier ist das, was ich tun würde:

  • mirrior die dir Baum, der eine 'output.txt' Datei hat und setzen die sortierte Datei dort

wie so:

#!/bin/bash 

LIST=`find $1 -name output.txt` 

for i in $LIST ; do 
     X=`dirname $i` 
     mkdir -p "sorted/$X" 
     sort "$i" -o "sorted/$i" 
done 

die oben braucht ein bisschen Polnisch, mkdir sollte ein 'wenn' um es herum und $ 1 sollte für die Gesundheit überprüft werden

gibt Ihnen dies:

Orignal:

mytest 
mytest/ccc 
mytest/ccc/f 
mytest/ccc/f/output.txt 
mytest/ccc/d 
mytest/ccc/d/output.txt 
mytest/ccc/e 
mytest/ccc/e/output.txt 
mytest/bbb 
mytest/bbb/f 
mytest/bbb/d 
mytest/bbb/e 
mytest/aaa 
mytest/aaa/f 
mytest/aaa/f/output.txt 
mytest/aaa/d 
mytest/aaa/d/output.txt 
mytest/aaa/e 
mytest/aaa/e/output.txt 

Ausgang:

sorted 
sorted/mytest 
sorted/mytest/ccc 
sorted/mytest/ccc/f 
sorted/mytest/ccc/f/output.txt 
sorted/mytest/ccc/d 
sorted/mytest/ccc/d/output.txt 
sorted/mytest/ccc/e 
sorted/mytest/ccc/e/output.txt 
sorted/mytest/aaa 
sorted/mytest/aaa/f 
sorted/mytest/aaa/f/output.txt 
sorted/mytest/aaa/d 
sorted/mytest/aaa/d/output.txt 
sorted/mytest/aaa/e 
sorted/mytest/aaa/e/output.txt 

ein letztes, was ich die Art der Ausgabedatei denke an eine tmp-Datei writen und dann umbenannt, wenn die Art getan wird, da sonst die Ausgabedatei gestutzt könnte die Eingabedatei, bevor alles gelesen wurde. Wie seds Inplace-Option.

Verwandte Themen