Перелічити діапазон файлів за допомогою підстановочних символів 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

Це не зовсім те, що ви шукаєте, але це найближче, що пропонують глобальні шаблони, і це, звичайно, краще, ніж вводити кожну файлову систему. Щонайменше кількість шаблонів, які вам знадобляться для числового діапазону, обмежується журналом числових кінцевих точок діапазону.


1

Ви можете використовувати регулярний вираз з grep. Я не гуру регексу. Далі повертає шаблон із цифрами між 25-50:

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

Я не знаю, чи можливо і як врешті-решт узагальнити це за допомогою грепу.


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 i in {025..050} ; do ... ; done
дужок
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.