В Bash гарантированы ли расширения подстановочного знака в порядке?

54

Гарантируется ли расширение подстановочного знака в Bash в алфавитном порядке? Я вынужден разбить большой файл на 10 Мбайт, чтобы они могли быть приняты моим репозиторием Mercurial.

Я подумал, что смогу использовать:

split -b 10485760 Big.file BigFilePiece.

а затем вместо:

cat BigFile | bigFileProcessor

Я мог бы сделать:

cat BigFilePiece.* | bigFileProcessor

на своем месте.

Тем не менее, я не смог найти нигде, который гарантировал бы, что расширение звездочки (или подстановочный знак, или иначе *) всегда будет в алфавитном порядке, так что это .aaбыло раньше .ab(в отличие от порядка меток времени или что-то в этом роде).

Кроме того, есть ли недостатки в моем плане? Насколько велика производительность при catобъединении файла?

санки
источник
4
Наверняка вы берете неправильный подход. Если администратор установил ограничение на размер файлов, которые у вас есть в репозитории, то вам следует поговорить с ним. Говоря о расширении - я всегда видел, что расширение является буквенно-цифровым.
Мирча Вутцовичи
1
Вы всегда можете пройти через канал, sortесли вам нужны какие-либо дополнительные манипуляции с заказами.
Warner
2
Обратите внимание, что Mercurial может управлять файлами любого размера, ограниченного объемом оперативной памяти. Вы получаете предупреждение, если добавляете большой файл, поскольку Mercurial предполагает, что он может хранить файл в памяти. Для слияний Mercurial необходимо хранить два файла в памяти. Поэтому машины с небольшим объемом оперативной памяти могут испытывать проблемы с проверкой файла. Я только что проверил это, и hg commitдля Nфайла в МБ требуется около 3 * NМБ ОЗУ и hg updateтребуется около 2 * NМБ ОЗУ. Это с Mercurial 1.5 на Linux.
Мартин Гейслер

Ответы:

67

Да, расширение globbing является алфавитным.

Со manстраницы Bash :

Расширение пути

После слов расщепления, если -fпараметр не установлен, Баш сканирует каждое слово для символов *, ?и [. Если появляется один из этих символов, слово считается шаблоном и заменяется отсортированным по алфавиту списком имен файлов, соответствующих шаблону.

Деннис Уильямсон
источник
@Dennis Williamson, есть идеи, если это все равно будет правдой, если у пользователя другой язык?
Зоредаче
5
@Zoredache: это на самом деле указано в POSIX: opengroup.org/onlinepubs/007908775/xsh/glob.html " Имена путей расположены в порядке сортировки, как определено текущей настройкой категории LC_COLLATE, см. Спецификацию XBD, LC_COLLATE [ opengroup.org / onlinepubs / 007908775 / xbd /… "и именно поэтому вы должны делать такие вещи, как ls -l [[:lower:]]вместо ls -l [a-z].
Деннис Уильямсон
Обратите внимание, что порядок в алфавитном порядке, поэтому BigFilePiece.10 будет предшествовать BigFilePiece.2
Кен
@DennisWilliamson - Почему две пары квадратных скобок? Кажется, один из них работает точно так же.
ArtOfWarfare
2
@ArtOfWarfare: Попробуйте это: mkdir lctest; cd lctest; touch w; touch z; ls -l [:lower:]; echo =====; ls -l [[:lower:]]. Файл "z" перечисляется только вторым, lsпотому что он запрашивает строчные буквы из однобуквенных имен файлов. Первый ls- без внешних квадратных скобок - запрашивает односимвольные имена файлов из списка символов «:», «l», «o», «w», «e» и «r». В обоих случаях крайние квадратные скобки ограничивают выражение в скобках, в котором перечислены символы и классы. В случае [[:lower:]], внутренние квадратные скобки, двоеточия и слово называют класс символа. ...
Деннис Уильямсон
4

Это документированное поведение, bashпоэтому вы можете зависеть от него в своих скриптах. Это также верно в отношении других совместимых с Bourne оболочек в течение очень долгого времени ... хотя могут быть угловые случаи, касающиеся свертывания регистра или не алфавитно-цифровых символов.

(Результирующий список bashбудет в почти "ASCII-бетическом" порядке - за исключением того, что строчные и прописные буквы будут сопоставляться вместе, как если бы не было различий в регистре, но с разбором в нижний регистр перед их эквивалентами в верхнем регистре. -алфавитные буквы должны сопоставляться в том же порядке, в котором они указаны в ASCII).

Как уже отмечали другие, это может быть нарушено настройками вашей языковой среды: LANG в целом и LC_COLLATE более конкретно. Может быть безопаснее всего запускать команды, которые зависят от упорядочения глобальных расширений под envкомандой для очистки среды (с использованием -iили -uв зависимости от ситуации) или для передачи результатов, sortчтобы обеспечить надежную последовательность.

Джим Деннис
источник
4
Похоже, что все не алфавитно-цифровые символы игнорируются в процессе сортировки. Таким образом, «=», «_», «~» не могут быть использованы для принудительного начала или окончания файла (соответственно) списка.
Отей
3

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

Убедитесь, что в вашем скрипте установлено значение «C», если вы хотите, чтобы это было переносимо.

adaptr
источник