"ls" или регулярное выражение нечувствительно к регистру?

7703
zhanwu

В bash я пробовал

ls [a-z]* 

и ожидается, что список всех файлов с именем файла начинается с маленькой буквы алфавита. Но почему файлы с именем начинается с большой буквы алфавита?

>ls [a-z]* D e > 

В случае необходимости, версия bash:

bash - версия GNU bash, версия 4.1.5 (1) -релиз (i486-pc-linux-gnu) Copyright (C) 2009 Free Software Foundation, Inc. Лицензия GPLv3 +: GNU GPL версии 3 или более поздней версии http: // gnu .org / лицензии / gpl.html

This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. 
5
* в bash не является регулярным выражением *. [az] выглядит как регулярное выражение, и bash, похоже, принимает это. Например, ls + не будет совпадать с aaa, поэтому, если он поддерживает регулярные выражения, он делает это только с трудом. Я не уверен, в какой степени, если вообще. echo a , echo a \ просто повторяет и не интерпретирует его как регулярное выражение. barlop 13 лет назад 0
Вот статья о сопоставлении шаблонов bash http://www.faqs.org/docs/bashman/bashref_35.html, в которой упоминается «Если опция оболочки extglob включена с помощью встроенной функции shopt, распознаются несколько расширенных операторов сравнения шаблонов. В последующем описании список шаблонов представляет собой список из одного или нескольких шаблонов, разделенных `| '. Составные шаблоны могут быть сформированы с использованием одного или нескольких из следующих подэлементов:« Но я не уверен, как вы включите этот вариант barlop 13 лет назад 0
На cygwin [az] * выглядит так же, как [[: lower:]] * они не отображают заглавные буквы. GNU bash, версия 3.2.51 (24) -релиз (i686-pc-cygwin) barlop 13 лет назад 0
@barlop: Поведение диапазонов символов зависит от локали, в частности от настройки LC_COLLATE. В некоторых (многих?) локалях `[az]` включает в себя «aAbB ... yYz», но не «Z». Вы можете включить расширенную глобализацию, используя `shopt -s extglob`. Я получаю разные результаты для `[az]` и `[[: lower:]]` на Cygwin. Dennis Williamson 13 лет назад 1

2 ответа на вопрос

3
Majenko

Это не регулярное выражение, и здесь возникает путаница. Вместо этого он использует систему, называемую «глобализация» - см .:

$ man 7 glob 

Вместо [az] вам нужно использовать [[: lower:]] как таковой:

$ ls -d [[:lower:]]* 
такое «глобализация» так называемого «расширения пути»? zhanwu 13 лет назад 0
Нет - расширение пути - это такие вещи, как ~ fred / foo.bar, переводящий в /home/fred/foo.bar Majenko 13 лет назад 0
1
Rich Homolka

1) Это может зависеть от вашей операционной системы, а точнее от вашей файловой системы. Ваша файловая система чувствительна к регистру? Вы не упоминаете ОС или тип файловой системы.

2) bash также может выполнять нечувствительную к регистру глобализацию. Вы можете проверить, если это ваш текущий случай сshopt | grep nocaseglob

Кроме того, помните, lsчто с файлами ничего не происходит. Ваша оболочка передает имена файлов в ls.