Сортировка вывода «найти»?


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: Какую проблему вы используете, используя 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

2

Если у вас установлен 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.