найти порядок сортировки команды по умолчанию

30

каков порядок сортировки по умолчанию для записей, возвращаемых командой linux find?

Например, если я выдаю

find . -type f -name '*mp3' 

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

Иногда это возвращает:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Посмотрите, как сначала перечисляется содержимое каталога B, затем содержимое каталога A. В то же время в каталоге A файлы перечислены в смешном порядке.

Наско
источник
Судя по опыту, это похоже на установку, т. Е. если у вас одинаковый набор файлов на двух машинах, он всегда будет возвращать один заказ на одном компьютере и совершенно другой на другом. Я задавался вопросом, почему раньше, +1
Джеймс Л
1
В моей машине есть FM-передатчик, и он всегда воспроизводит песни с моей флэшки в странном порядке. Я никогда не понимал этого, но я понял, что это был точно такой же порядок, в котором вышеприведенная команда вернула свой вывод
Наско
Кстати: BSD find имеет -sпараметр для сортировки по алфавиту.
Lapo

Ответы:

19

findбудет проходить по дереву каталогов, в котором элементы заказа хранятся в записях каталогов. Это (в основном) будет согласованным от запуска к запуску на одном и том же компьютере и, по сути, будет «порядком создания файла / каталога», если не было удалений.

Однако некоторые файловые системы будут переупорядочивать записи каталога как часть операций сжатия или когда необходимо увеличить размер записи, поэтому всегда существует небольшая вероятность того, что «сырой» порядок изменится со временем. Если вы хотите последовательный порядок, пропустите вывод через дополнительный этап сортировки.

Vatine
источник
Спасибо за ваш подробный ответ! Таким образом, если мой FM-передатчик (см. Мой предыдущий комментарий) воспроизводит дорожки в порядке, в котором команда find перечисляет их, я не могу контролировать, в каком порядке я хотел бы, чтобы они воспроизводились.
Наско
Что ж, флэш-карта, вероятно, использует файловую систему FAT, и, если я правильно помню, манипулирование порядком записей FAT довольно легко с помощью отладчика файловой системы. Возможно, стоит скопировать песни с текущей вспышки на новую, в том порядке, в котором вы хотите их воспроизвести, что может быть проще.
Vatine
Одним из полезных приложений такой согласованности является оценка медленного выполнения find /path/ -exec ...с гораздо более быстрым выполнением, find /path/чтобы сначала получить отсортированный список файлов.
Андрей
6

Вы не должны полагаться на конкретный порядок вывода, findа вместо этого должны использовать sortи другие средства для конкретного управления порядком.

Приостановлено до дальнейшего уведомления.
источник
2

Я работаю в UNIX / Linux с 1984/1991 года соответственно, и первая команда, которой меня научили, была команда find. Linux / GNU поместил почти все, что вам нужно, в текущую команду поиска, так что поиграйте с ней.

Вот несколько полезных советов по сортировке результатов поиска. Опция -printf предоставляет вам множество опций для более сложной сортировки и представления информации о файле. Это лучшее для таких проблем. Поиграйте с ним, чтобы увидеть, что будет работать для вас. Используя -printf вы можете настроить и разграничить результаты так, как вы хотите. Это очень помогает, когда вам нужно опубликовать результаты обработки. Я надеюсь, что это помогает кому-то.

  1. Если вы используете -ls и хотите отсортировать по имени файла, 11-е поле - это имя файла, поэтому вы можете сделать следующее. Опция sort -k также может принимать несколько полей для сортировки.

    найти / путь -ls | сортировка -k11

  2. Если вы хотите более точный контроль зернистости по дате / времени в порядке возрастания или убывания, используйте опцию -printf "". См. Руководство для получения более подробной информации, но ниже приведен пример, который будет печататься за доли секунды, поэтому он очень точный.

ПРИМЕР. ДАТА / ВРЕМЯ: 2016-09-17 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Другой способ сделать это без символов в строке даты / времени -.

ПРИМЕР ДАТА / ВРЕМЯ: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
Дэвид Конгер-Элдин
источник