2009-06-03 7 views
0

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

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

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

ответ

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

Похоже, что он работает (займет некоторое время, поэтому не может быть уверен). Я мог бы поклясться, что попробовал нечто похожее на это (разве это не всегда так?) В любом случае ты качаешься. –

+0

Можете ли вы действительно использовать сортировку для использования того же выходного файла, что и входной файл? Я сомневаюсь в этом. – lothar

+0

@lothar, что бы вы ни сомневались в этом или нет, он все равно будет работать: -p программа сортировки считывает весь файл, сортирует строки в памяти и затем записывает вывод – fortran

-1

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

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

Вышеприведенное будет производить все отсортированные строки в одном файле, а не сортировать каждый файл. – kbyrd

+0

не будет «сортировать -o» поможет вам здесь? – kbyrd

0

Попробуйте

csh <enter> 

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

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

+0

теперь верно. В предыдущей версии был создан только один файл со всеми строками. Сожалею. – Luixv

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 

одна последняя вещь, которую я считаю, что выход сортировать файл прописан в файле TMP, а затем переименован, когда-то будет сделано, в противном случае выходной файл может укоротить входной файл перед тем, как все будет прочитано. Как опция sed inplace.

Смежные вопросы