Существует до четырех соглашений об использовании параметров командной строки unix:
Например:
$ tar -x -v -z -f package.tar.gz
$ tar -xvzf package.tar.gz
$ tar xvzf package.tar.gz
$ tar --extract --verbose --gzip --file package.tar.gz
Это проблема локали . В вашем регионе [AZ]
заменяется на что-то вроде [AbBcZ ... zZ]
(плюс, возможно, другие символы с диакритическими знаками), поэтому [^ AZ]
фактически означает «файлы, которые заканчиваются на a
» в вашем примере (и только в вашем примере).
Если вы хотите избежать такой неожиданности, один из способов - установить LC_COLLATE = C
, поскольку сопоставление - это часть ваших языковых настроек, которая отвечает за порядок сортировки. Кроме того, пустой LC_ALL
, если он установлен, так как он будет иметь приоритет.
$ ls [a-z]*[^A-Z]
aa ha
$ ( LC_ALL=; LC_COLLATE=C; ls [a-z]*[^A-Z] )
a123e aa ah ha hh
Или, что лучше, лучше не менять настройки локали и использовать соответствующие классы: [: lower:]
вместо [az]
и [: верхний:]
вместо [AZ]
.
$ ls [[:lower:]]*[^[:upper:]]
a123e aa ah ha hh
Или используйте параметр globasciiranges
в bash:
$ shopt -s globasciiranges
$ ls [a-z]*[^A-Z]
a123e aa ah ha hh
$ shopt -u globasciiranges
$ ls [a-z]*[^A-Z]
aa ha