2009-06-03 64 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选项一样。