2009-06-03 45 views
0

在Ubuntu上,我在樹中有一堆文件,都稱爲'output.txt'。對於每個文件,我想用「排序」按字母順序對行進行排序。我認爲如何按字母順序排列一堆文件,遞歸地

找到。 -name output.txt -exec sort {} \;

但這將排序的行輸出到控制檯,而不是更新我想要的原始文件。

回答

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

看起來像是在工作(需要一段時間,所以不能確定)。我可以發誓我嘗試了類似的東西(是不是總是這樣?)無論如何,你搖滾。 – 2009-06-03 13:26:32

+0

你真的可以使用sort來使用與輸入文件相同的輸出文件嗎?我對此表示懷疑。 – lothar 2009-06-03 15:09:26

+0

@lothar無論你是否懷疑它,它仍然會工作:-p排序程序讀取整個文件,排序內存中的行,然後寫入輸出 – fortran 2009-06-03 15:20:26

-1

我還沒有用過很多Linux,所以我可能會誤解,但是不應該可以用StdOut來控制它嗎?

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

以上將在單個文件中生成所有已排序的行,而不是對每個文件進行排序。 – kbyrd 2009-06-03 13:16:00

+0

不會'排序'在這裏幫助你? – kbyrd 2009-06-03 13:17:27

0

試試這個

csh <enter> 

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

你會生成文件的排序副本。

+0

現在是正確的。以前的版本只生成一個包含所有行的文件。抱歉。 – Luixv 2009-06-03 13:24:37

1

的Fortran,

我會做有點不同,我不會將文件放入自行解決。在進行排序之後,只要將任何新的內容添加到文件中即可。這裏是我會做什麼:

  • mirrior具有「output.txt的」文件,並把排序文件有

像這樣的目錄樹:

#!/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 

以上需要一點波蘭語,mkdir應該有一個'如果'周圍,1美元應該檢查的理智

給你這個:

一部開拓創新:

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 

輸出:

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 

最後一件事情我覺得排序輸出文件writen到tmp文件,然後在排序完成更名,否則輸出文件可能截斷在讀取所有內容之前的輸入文件。就像sed的inplace選項一樣。