Как отсортировать кучу файлов по алфавиту, рекурсивно - PullRequest
0 голосов
/ 03 июня 2009

В Ubuntu у меня есть куча файлов в дереве, все они называются «output.txt». Для каждого файла я хочу отсортировать строки в алфавитном порядке с помощью сортировки. Я считал

найти. -name output.txt -exec sort {} \;

но это выводит отсортированные строки на консоль, а не обновляет исходные файлы, что я и хочу.

Ответы [ 4 ]

3 голосов
/ 03 июня 2009
find . -name output.txt -exec sort{} -o{} \;
1 голос
/ 04 июня 2009

Fortran,

Я бы сделал это немного по-другому, я бы не сортировал файл в себя. Просто добавьте что-нибудь новое в файлы после сортировки. вот что я бы сделал:

  • отражает дерево каталогов с файлом '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 должно быть 'if', а $ 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

последнее, что мне кажется, выходной файл сортировки записывается в tmp-файл и затем переименовывается после завершения сортировки, иначе выходной файл может обрезать входной файл до того, как все будет прочитано. Как вариант с Sed.

0 голосов
/ 03 июня 2009

Попробуйте это

csh <enter>

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

вы создадите отсортированную копию вашего файла.

0 голосов
/ 03 июня 2009

Я не очень много использовал Linux, так что я могу ошибаться, но разве вы не сможете контролировать это с помощью StdOut?

find . -name output.txt -exec sort{} \ > output.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...