Я хотел знать, перебирать ли файлы в каталоге с
for f in directory/*
будет иметь некоторый порядок обработки записей по умолчанию (имя файла, дата создания и т. д.?), или он недетерминирован?
Наверное, это очевидно, но я не смог найти информацию.
directory/*
сначала расширяется оболочкой (обычно bash). Бег echo directory/*
отобразит все совпадающие файлы, и bash сначала отсортирует эти совпадающие элементы лексикографически, прежде чем передавать их в качестве аргументов в echo
, который затем их печатает.
В случае запуска ls directory/*
, то directory/*
сначала расширяется оболочкой, а затем представляется в виде списка аргументов для ls
. Заказ, который ls
затем используется для вывода файлов в зависимости от предоставленных ему необязательных аргументов, которые позволяют выводить список файлов на основе альтернативных критериев, таких как размер, время изменения и т. д., но эта сортировка выполняется внутри ls
двоичный файл, после того, как ему был передан лексикографически отсортированный расширенный список аргументов из оболочки bash.
Порядок будет в лексикографическом порядке (в алфавитном порядке). Это будет точно так же, как то, что вы увидите, если наберете ls directory/*
в приглашении оболочки Bash.
Если вы хотите отсортировать по времени модификации, вы можете использовать ls -t
. Видеть man ls
для других вариантов сортировки.