Файлы с именами в определённом диапазоне чисел (как указать одной конструкцией?)

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

Всем доброго времени суток.
Столкнулся сейчас с такой задачей. Есть папка с фотографиями, файлы в которой имеют вид DSCNxxxx.JPG, где x - цифра. Необходимо скопировать файлы, числа в именах которых входят в кокретный диапазон чисел, например 3947-3965. Как можно регулярным выражением передать cp необходимый список файлов?
З.Ы. Юзаю zsh.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Файлы с именами в определённом диапазоне чисел

Сообщение allez »

Попробуйте так:

Код: Выделить всё

cp DSCN{3947..3965}.JPG /where/to/copy

Это, правда, к регулярным выражениям отношения не имеет, но с поставленной задачей должно справляться. :)
И еще: не все числа в указанном диапазоне могут присутствовать в именах файлов, так как некоторые файлы могут быть удалены. Тогда, чтобы избавить себя от ненужных сообщений об ошибках, можно будет использовать конструкцию вроде этой:

Код: Выделить всё

ls DSCN{3947..3965}.JPG 2>/dev/null | cpio -pvdm /where/to/copy
Спасибо сказали:
Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Re: Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

Точно! Спасибо, allez. А я там дефис вместо точек ставил...

А, собственно, почему это не является регулярным выражением?..
Спасибо сказали:
iglezz
Сообщения: 43
ОС: Debian testing

Re: Файлы с именами в определённом диапазоне чисел

Сообщение iglezz »

shau-kote
Это фича bash:

Код: Выделить всё

$ echo {1..5}
1 2 3 4 5
--{ ~ }------------------------------------------------------
$ echo {1..5..2}
1 3 5
--{ ~ }------------------------------------------------------
$ echo {5..-5..-2}
5 3 1 -1 -3 -5
--{ ~ }------------------------------------------------------
$ echo {a..z..2}
a c e g i k m o q s u w y

Подробности в man bash (искать Brace Expansion)

Упс.. Не заметил сразу что у ТС zsh..
Спасибо сказали:
Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Re: Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

А разве регулярные выражения - это не "фичи" шелла?.. :)
Спасибо сказали:
Аватара пользователя
ZyX
Сообщения: 355
ОС: Gentoo

Re: Файлы с именами в определённом диапазоне чисел

Сообщение ZyX »

У zsh на этот случай помимо {N..M} есть <[N]-[M]>. *<->* выберет все файлы, содержащие хоть какое-то число, DSCN<3947->.JPG выберет все файлы, с числом большим или равным 3947 (при этом начальные нули игнорируются), DSCN<3947-3965>.JPG выберет то, что вы просили. Надо отметить, что <0-2>* заберёт и файл 0, и файл 1, и файл 10 (так как <-> заберёт единицу, а 0 заберёт звёздочка), поэтому после <-> надо обязательно указать что-то, подо что не может подпадать цифра. В вашем примере это точка перед расширением.
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Файлы с именами в определённом диапазоне чисел

Сообщение allez »

shau-kote писал(а):
14.01.2011 19:45
А разве регулярные выражения - это не "фичи" шелла?
Нет, эти "фичи" возникли до шелла, и даже до появления UNIX. :)
Спасибо сказали:
Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Re: Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

allez писал(а):
14.01.2011 20:46
Нет, эти "фичи" возникли до шелла, и даже до появления UNIX. :)

В смысле, реализуются они шеллом.
(Wikipedia) писал(а):Регуля́рные выраже́ния (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэ́кспы или ре́гексы) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.

По-моему, Ваш пример вполне попадает под это определение. Нет?..

ZyX, круто, не знал. Спасибо огромное. :)
Спасибо сказали:
allez
Сообщения: 2223
Статус: Не очень злой админ :-)
ОС: SuSE, CentOS, FreeBSD, Windows

Re: Файлы с именами в определённом диапазоне чисел

Сообщение allez »

shau-kote писал(а):
14.01.2011 21:01
(Wikipedia) писал(а):Регуля́рные выраже́ния (англ. regular expressions, сокр. RegExp, RegEx, жарг. регэ́кспы или ре́гексы) — это формальный язык поиска и осуществления манипуляций с подстроками в тексте, основанный на использовании метасимволов (символов-джокеров, англ. wildcard characters). По сути это строка-образец (англ. pattern, по-русски её часто называют «шаблоном», «маской»), состоящая из символов и метасимволов и задающая правило поиска.

По-моему, Ваш пример вполне попадает под это определение. Нет?..
Таки нет. Как вполне справедливо заметил iglezz, это особенность именно конкретной оболочки - bash, zsh... В других оболочках (например, tcsh) конструкции вида {a..b} не работают. Регулярным же выражениям "по барабану", в какой среде они применяются - sh, bash, pdksh... :)
Спасибо сказали:
Аватара пользователя
KiWi
Бывший модератор
Сообщения: 2521
Статус: статус, статус, статус

Re: Файлы с именами в определённом диапазоне чисел

Сообщение KiWi »

shau-kote писал(а):
14.01.2011 19:16
А, собственно, почему это не является регулярным выражением?..

У регулярных выражений есть текст, к которым они применяются.

Эта штука ничего не ищет и не меняет -- она просто раскрывает {a..c} в "a b c" -- вполне стандартный range, который есть в разных ЯП.
Спасибо сказали:
Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Re: Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

То есть, если я правильно понял, регулярное выражение шелл сравнивает со всеми имеющимися значениями (строками), а конструкцию {a..d} просто раскрывает в a, b, c, d. Так?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5456
ОС: Gentoo

Re: Файлы с именами в определённом диапазоне чисел

Сообщение /dev/random »

shau-kote писал(а):
15.01.2011 14:26
регулярное выражение шелл сравнивает со всеми имеющимися значениями (строками)

Регулярное выражение _кто-то_ сравнивает с _чем-то_ или ищет в _чём-то_. Кто и с чем / в чём - зависит от контекста.
Спасибо сказали:
Аватара пользователя
t.t
Бывший модератор
Сообщения: 7390
Статус: думающий о вечном
ОС: Debian, LMDE

Re: Файлы с именами в определённом диапазоне чисел

Сообщение t.t »

shau-kote писал(а):
15.01.2011 14:26
То есть, если я правильно понял, регулярное выражение шелл сравнивает со всеми имеющимися значениями (строками), а конструкцию {a..d} просто раскрывает в a, b, c, d. Так?
За исключением поправки, которую дал /dev/random, да. Заметьте также, что это не маска:

Код: Выделить всё

$ touch a c d
$ ls [abcd]
a  c  d
$ ls {a..d}
ls: невозможно получить доступ к b: Нет такого файла или каталога
a  c  d
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
Спасибо сказали:
Аватара пользователя
shau-kote
Сообщения: 417
Статус: злобный хоббит
ОС: Arch

Re: Файлы с именами в определённом диапазоне чисел

Сообщение shau-kote »

Спасибо, разобрался. :)
Спасибо сказали: