Glob без учета регистра на zsh/bash

Мне нужно перечислить все файлы, имена которых начинаются с SomeLongString. Но случай SomeLongString может быть разным. Как?

Я использую zsh, но решение bash также приветствуется.


person Agnel Kurian    schedule 01.10.2008    source источник


Ответы (5)


ЗШ:

$ unsetopt CASE_GLOB

Или, если вы вообще не хотите включать подстановку без учета регистра, вы можете активировать ее только для изменяющейся части:

$ print -l (#i)(somelongstring)*

Это будет соответствовать любому файлу, который начинается с «somelongstring» (в любой комбинации нижнего/верхнего регистра). Флаг без учета регистра применяется ко всему, что заключено в круглые скобки, и может использоваться несколько раз. Прочтите руководство zshexpn(1) для получения дополнительной информации.

ОБНОВЛЕНИЕ Чуть не забыл, чтобы это работало, необходимо включить расширение расширения:

setopt extendedglob
person jkramer    schedule 01.10.2008
comment
А как насчет setopt no_CASE_GLOB? - person ksoo; 18.01.2014
comment
Как бы то ни было, если у вас установлен nocaseglob, вы можете использовать (#I), чтобы временно отменить его для чувствительного к регистру глобуса. - person jakar; 25.09.2019

удар:

shopt -s nocaseglob
person Jacek Szymański    schedule 01.10.2008
comment
Спасибо. Я надеялся, что есть способ указать его как часть самого шара. В руководстве zsh упоминается что-то подобное, но я не смог понять. - person Agnel Kurian; 01.10.2008

В зависимости от того, насколько глубоко вы хотите иметь этот список, find предлагает довольно много в этом отношении:

find . -iname 'SomeLongString*' -maxdepth 1

Это даст вам только файлы в текущем каталоге. Здесь важен параметр -iname вместо -name.

person Horst Gutmann    schedule 01.10.2008

Для полноты (и, честно говоря, удивлен, что это еще не упомянуто, хотя все остальные ответы лучше и/или «более правильные»), очевидно, можно также использовать (особенно для grep поклонников):

$ ls | egrep -i '^SomeLongString'

Можно также вставить избыточный ls -1 (это вариант "one", а не "ell"), но при передаче в канал каждая запись уже будет по одной на строку в любом случае. Я бы обычно использовал что-то подобное (вместо set) в сценариях оболочки, например, в цикле for/while: for i in $(ls | grep -i ...) . Однако другой ответ с использованием find был бы предпочтительнее и более гибким в этом случае, потому что вы можете, например, опустить каталоги (или установить другие ограничения): for i in $(find . -type f -iname 'SomeString*' -print -maxdepth 1)... или даже вообще отказаться от цикла и просто использовать всю мощь find сама по себе , например: find ... -exec do_stuff {} \; ... , но я отвлекся (опять же, для полноты).

person michael    schedule 05.11.2019

person    schedule
comment
Вам нужно заключить в кавычки глобус, чтобы безопасно передать его функции. Если *jtweet* соответствует чему-либо, оно будет расширено до того, как функция увидит его. (Или ошибка или пустая строка в зависимости от других настроек shopt). Интересная идея, однако. Я думаю, что в основном это будет работать, если вы запустите i ls '*jtweet*', даже если в каталоге также есть `jtweet.pm. Однако существует множество потенциальных проблем с пробелами или другими специальными символами в аргументах, отличных от универсальных, или в глобусах. - person Peter Cordes; 03.06.2017