14

Скажем, например, у меня есть следующие файлы в моем рабочем каталоге: mjk0001.fits, mjk0002.fits, ... численно увеличиваясь вплоть до mjk9999.fits.

Есть ли способ использовать подстановочные знаки UNIX для перечисления или работы с последовательной группой из них? Например, если мне нужно запустить процесс с 0025 по 0050, какой формат я бы использовал?

Я пробовал следующее, но безуспешно:

ls *[25-50].fits
ls mjk00[25-50].fits
ls mjk[0025-0050]*
ls *[0025-0050]*

Заранее всем спасибо, МК

4 ответа4

18

Вы можете использовать расширение скобки:

ls mjk00{25..50}.fits

Ведущие нули могут быть включены при необходимости:

ls mjk0{000..149}.fits
1

Не напрямую, но вы можете использовать несколько шаблонов глобуса:

ls mjk002[56789].fits mjk00[34]?.fits

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

1

Вы можете использовать регулярные выражения с grep. Я не гуру регулярных выражений. Далее возвращается шаблон с числами между 25-50:

ls | sort -n | grep -E 'mjk00([2][5-9]|[3-4][0-9]|[5][0]).fits'

Я не знаю, возможно ли это и как в конечном итоге обобщить это с помощью grep.

0

Возможно добиться большей переносимости или гибкости, используя for loop и printf:

for i in $(seq 25 50 1) ; do ls --escape $(printf "mjk%04d*" $i) ||true; done

Это хорошо обрабатывает пробелы, и результаты хорошо подходят для передачи в xargs для дальнейшей обработки.

Числа с несколькими совпадениями приведут к тому, что все соответствующие файлы будут перечислены.

Числа без совпадений будут сообщать об ошибке в stderr, но ||true подавляет возврат ошибки уровня bash.


Однако в базовом случае использование for и printf ничем не отличается от более сжатого:

ls --escape mjk{0025..0050..1}* ||true

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .