Гарантированно ли расширение подстановочного знака в Bash в алфавитном порядке? Я вынужден разбить большой файл на части по 10 Мб, чтобы их можно было принять в моем репозитории Mercurial.
Итак, я подумал, что могу использовать:
split -b 10485760 Big.file BigFilePiece.
а затем вместо:
cat BigFile | bigFileProcessor
Я мог бы сделать:
cat BigFilePiece.* | bigFileProcessor
на своем месте.
Однако я не смог найти нигде, которая гарантировала бы, что расширение звездочки (aka wildcard, aka *
) всегда будет в алфавитном порядке, так что .aa
пришел раньше .ab
(в отличие от порядка меток времени или чего-то подобного).
Кроме того, есть ли в моем плане недостатки? Насколько велика стоимость производительности cat
собираете файл вместе?
Да, расширение подстановки происходит по алфавиту.
Из Баш man
страница:
Расширение пути
После разделения слов, если
-f
установлена опция, bash сканирует каждое слово на наличие символов*
,?
, и[
. Если появляется один из этих символов, то слово рассматривается как образец и заменяется отсортированным по алфавиту списком имен файлов, соответствующих этому образцу.
Это задокументированное поведение для bash
так что вы можете положиться на него в своих сценариях. Это также верно в отношении других Bourne-совместимых оболочек в течение очень долгого времени ... хотя могут быть крайние случаи, касающиеся сворачивания регистра или не буквенно-цифровых символов.
(Результирующий список в bash
будет в почти "ASCII-бетическом" порядке --- за исключением того, что буквы нижнего и верхнего регистра будут сопоставлены вместе, как если бы не было различий в регистре, но с сортировкой нижнего регистра до их эквивалентов в верхнем регистре. Все неалфавитные символы должны быть сопоставлены в том же порядке, в котором они представлены в ASCII).
Как отмечали другие, это может быть нарушено настройками среды, связанной с вашим языком: LANG в целом и LC_COLLATE в частности. Возможно, безопаснее всего запускать команды, которые зависят от порядка раскрытия глобуса под env
команда для очистки среды (используя -i
или -u
в зависимости от ситуации) или передать результаты через sort
для обеспечения надежной последовательности.
Хотя расширения глобусов отсортированы в алфавитном порядке, они также подчиняются настройке языка оболочки.
Убедитесь, что в вашем скрипте установлено значение «C», если вы собираетесь переносить его.