Сортування результатів "знайти"?


77

Мені потрібно вміти в алфавітному порядку сортувати вихід, findперш ніж передати його команді. Вхід | sort |між ними не спрацював, і що я можу зробити?

find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand

Відповіді:


52

Використовуйте findяк завжди і розмежуйте свої лінії за допомогою NUL. GNU sortможе впоратися з цим за допомогою перемикача -z:

find . -print0 | sort -z | xargs -r0 yourcommand

58

Деякі версії програми sortмають -zопцію, яка дозволяє проводити записи з недійсним завершенням.

find folder1 folder2 -name "*.txt" -print0 | sort -z | xargs -r0 myCommand

Крім того, ви також можете написати сценарій високого рівня для цього:

find folder1 folder2 -name "*.txt" -print0 | python -c 'import sys; sys.stdout.write("\0".join(sorted(sys.stdin.read().split("\0"))))' | xargs -r0 myCommand

Додайте -rпараметр, щоб xargsпереконатися, що myCommandвикликається аргументом.


Хороший (два?) ... Цікаво, однак, що два способи по- .різному обробляють ... З sortцим він закінчується в кінці списку ... з pythonним сортується до початку. (можливо, LC_COLLATE=C
питон

Є також -t \0варіант для сортування (що є -zсинонімом)
Хав'єр

1
Проблема всіх цих |sortрішень полягає в тому, що ви більше не можете користуватися -exec. Гаразд, хоча можна переписати подане вами твердження -execтак, щоб воно працювало xargs, питання в тому, що з "міні-скриптами" ? ( sh -c ...) Я б не закликав цю дрібницю перетворити міні-скрипт 'sh -c' з декількома командами, щоб він міг працювати xargs(якщо це можливо взагалі)
syntaxerror

@syntaxerror: З якою проблемою у вас використовується sh -c з xargs? printf %s\\n a b c d e | xargs -n3 sh -c 'printf %s, "$@"; printf \\n' x
Роджер Пате

4

Я думаю, вам потрібен -nпрапор для сортування №

Відповідно до роду людини:

-n, --numeric-sort
    compare according to string numerical value

редагувати

У print0 може бути щось спільне з цим, я лише перевірив це. Вийміть print0, ви можете скасувати рядок у сортуванні за допомогою -zпрапора


Ну, це, print0мабуть, розділяє прозвища, які розділяють простір, і це те, що мені потрібно передати своїй команді, на жаль,
Industrial

1

Якщо у вас встановлений GNU Parallel http://www.gnu.org/software/parallel/, ви можете це зробити:

find folder1 folder2 -name "*.txt" -print | 
  sort |
  parallel myCommand

Ви можете встановити GNU Parallel просто:

wget http://git.savannah.gnu.org/cgit/parallel.git/plain/src/parallel
chmod 755 parallel
cp parallel sem

Перегляньте вступні відео для GNU Parallel, щоб дізнатися більше: https://www.youtube.com/playlist?list=PL284C9FF2488BC6D1


Яке виправдання для використання GNU Parallel? Щоб пришвидшити це?
Пітер Мортенсен

Це і вам не потрібно возитися з \ 0 розділеними записами.
Оле Танге
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.