
Мне нужно иметь возможность сортировать вывод по алфавиту find
перед передачей его в команду. Ввод | sort |
между не сработал, так что я могу сделать?
find folder1 folder2 -name "*.txt" -print0 | xargs -0 myCommand
решение1
Используйте find
как обычно и разделяйте строки символом NUL. GNU sort
может обрабатывать их с помощью ключа -z:
find . -print0 | sort -z | xargs -r0 yourcommand
решение2
В некоторых версиях 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
она вызывается с аргументом.
решение3
Я думаю, вам нужен -n
флаг для сортировки#
По мнению человека сортировка:
-n, --numeric-sort
compare according to string numerical value
редактировать
Print0 может иметь к этому отношение, я только что проверил это. Возьмите print0, вы можете завершить строку нулем в sort, используя -z
флаг
решение4
Некоторые реализации find
поддерживают упорядоченный обход напрямую через -s
параметр:
$ find -s . -name '*.json'
Из FreeBSD находимстраница руководства:
-s Cause find to traverse the file hierarchies in lexicographical
order, i.e., alphabetical order within each directory. Note:
`find -s' and `find | sort' may give different results.