Мне нужно перечислить все файлы, имена которых начинаются с SomeLongString. Но случай SomeLongString может быть разным. Как?
Я использую zsh, но решение bash также приветствуется.
Мне нужно перечислить все файлы, имена которых начинаются с SomeLongString. Но случай SomeLongString может быть разным. Как?
Я использую zsh, но решение bash также приветствуется.
ЗШ:
$ unsetopt CASE_GLOB
Или, если вы вообще не хотите включать подстановку без учета регистра, вы можете активировать ее только для изменяющейся части:
$ print -l (#i)(somelongstring)*
Это будет соответствовать любому файлу, который начинается с «somelongstring» (в любой комбинации нижнего/верхнего регистра). Флаг без учета регистра применяется ко всему, что заключено в круглые скобки, и может использоваться несколько раз. Прочтите руководство zshexpn(1)
для получения дополнительной информации.
ОБНОВЛЕНИЕ Чуть не забыл, чтобы это работало, необходимо включить расширение расширения:
setopt extendedglob
setopt no_CASE_GLOB
?
- person ksoo; 18.01.2014
nocaseglob
, вы можете использовать (#I)
, чтобы временно отменить его для чувствительного к регистру глобуса.
- person jakar; 25.09.2019
удар:
shopt -s nocaseglob
В зависимости от того, насколько глубоко вы хотите иметь этот список, find
предлагает довольно много в этом отношении:
find . -iname 'SomeLongString*' -maxdepth 1
Это даст вам только файлы в текущем каталоге. Здесь важен параметр -iname
вместо -name
.
Для полноты (и, честно говоря, удивлен, что это еще не упомянуто, хотя все остальные ответы лучше и/или «более правильные»), очевидно, можно также использовать (особенно для 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 {} \; ...
, но я отвлекся (опять же, для полноты).
*jtweet*
соответствует чему-либо, оно будет расширено до того, как функция увидит его. (Или ошибка или пустая строка в зависимости от других настроек shopt
). Интересная идея, однако. Я думаю, что в основном это будет работать, если вы запустите i ls '*jtweet*'
, даже если в каталоге также есть `jtweet.pm. Однако существует множество потенциальных проблем с пробелами или другими специальными символами в аргументах, отличных от универсальных, или в глобусах.
- person Peter Cordes; 03.06.2017