Різноманітні діапазони файлів у лексикографічному порядку в zsh


24

Я б хотів вказати діапазон файлів (у лексикографічному порядку) з двома цілими числами (наприклад, від 2 до 57) у zsh шляхом глобалізації.

Наприклад: "виберіть файли від 2 до 57 у лексикографічному порядку під контуром, який відповідає деякому шаблону глобалізації".

Я думав, що це зробить квадратні дужки

 for x in /foo/bar/*[2-57]; do print $x; done

але ЗШ , мабуть , думає , що я прошу за файли 2до 5(або що - щось подібне) , а не файли 2в 57. Будь-які думки чому? Як я можу це досягти?

Відповіді:


30

[2-57]являє собою набір символів , що складається з 2, 3, 4, 5і 7, в Zsh і будь-який інший шаблону і синтаксисі регулярних виразів там. Ваш шаблон шаблону *[2-57]відповідає кожному імені файлу, останній символ якого - одна з цих п'яти цифр.

Я думаю, ви неправильно запам'ятовуєте синтаксис глобального [m,n] класифікатора . Кваліфікатори глобусу завжди містяться в дужках в кінці шаблону, а роздільник діапазону є комою. Шаблон *([2,57])розширюється до 2-го, 3-го,…, 57-го збігів. Порядок розширення за замовчуванням є лексикографічним (з якоюсь особливою магією сортувати числа за порядковим числом, якщо numeric_glob_sortпараметр встановлений); ви можете керувати ним за допомогою oабо Oглобального класифікатора (наприклад, *(om[2,57])щоб відповідати 57 найновішим файлам, крім одного самого останнього файлу).

for x in /foo/bar/*([2,57]); do print $x; done

Не те, про що ви просили, але пов’язане і, можливо, корисне майбутнім читачам: якщо ви хочете перерахувати файли від 2 до 57, існують вони чи ні, ви можете використовувати вираз діапазону дужок . Ця функція існує також у bash та ksh.

echo hello{2..57}

І якщо ви хочете відповідати файлам, ім'я яких містить число від 2 до 57, ви можете використовувати шаблон <2-57>. Це специфічно для zsh.

$ ls
file1 file2 file3 file57 file58
$ echo file<2-57>
file2 file3 file57

Зауважте, що такий зразок *<2-57>, ймовірно, не буде робити те, що ви очікуєте, тому що *може відповідати цифрам. Наприклад, file58сірники *<2-57>, з file5узгодженням *частини та 8узгодженням <2-57>частини. Ця модель *[^0-9]<2-57>уникає цього питання.


Ти правий. Я неправильно пам'ятав глобальний класифікатор. Дякую за уважне пояснення.
Амеліо Васкес-Рейна

До речі, ця заява у мене трохи переплутав: if you want to enumerate files 2 to 57 whether they exist or not, you can use a range brace expression. Якщо файлів не існує і немає збігів, як би розширення дужок знало, як розширити? (як би він розширився інакше від класифікатора?)
Амеліо Васкес-Рейна

2
@intrpc foo{8..11}barрозширюється до foo8bar foo9bar foo10bar foo11bar. Цей біт розширення не пов'язаний з іменами файлів. Аналогічно foo{eight,nine,ten,eleven}barрозширюється і до fooeightbar fooninebar footenbar fooelevenbar. Це розширення дужок у ksh / bash / zsh.
Жил 'SO- перестань бути злим'

6

але zsh, мабуть, думає, що я прошу файли 2 - 5 (або щось подібне) замість файлів 2 - 57. Будь-які думки, чому?

Оскільки []дужки вказують список відповідних символів (які можуть бути цифрами), а не числа, інтерпретовані математично. Такий шаблон узгоджується з одним символом. Список може містити діапазони, але цифр або літер. [2-57]Матч розширюється до "Усі цифри в діапазоні від 2 до 5 і 7" .

Щоб відповідати числам від 2 до 57, було б легше використовувати вираз послідовності замість глобулярного шаблону (або разом з таким):

for x in /foo/bar/*{2..57}; do print $x; done

Редагувати : Але це, на жаль, не надасть вам лексикографічного порядку для всіх перерахованих файлів - вони будуть згруповані за загальним числовим закінченням через розширення оболонки.


Дякую @rozcietrzewiacz! Я мав би подумати про це. У моїх файлах були номери, тому я на мить подумав []надрукувати речі по порядку ..
Амеліо Васкес-Рейна

Ваше пояснення [2-57]правильне, але я не думаю, що {2..57}(це ви мали на увазі, правда?) Має відношення до того, що хоче зробити intrpc, а саме: "виберіть файли від 2 до 57 у лексикографічному порядку".
Жил "ТАК - перестань бути злим"

Дякую за редагування (я думаю, час спати). І ти маєш рацію - я забув про частину лексикографічного порядку .
rozcietrzewiacz
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.