Диапазон списка файлов с подстановочными знаками UNIX


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]*

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


Ответы:


20

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

ls mjk00{25..50}.fits

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

ls mjk0{000..149}.fits

1
Используя этот синтаксис, вы можете также указать значение шага: {25..50..2}.
nobar

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цикл и 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

Если вы хотите разделить результаты расширения скобок, вы можете использовать цикл for:for i in {025..050} ; do ... ; done
nobar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.