Grep несколько файлов с датами в имени файла для определенного диапазона дат

по этой ссылке описано, как дескриптор строки 0 хранит список всех языков, которые используются остальными строками в виде 16-битных кодов, например 0x0409 для English USA. (Чаще всего список состоит только из одного языка.)

Когда утилита usb запрашивает поиск строки, она указывает с помощью этого 16-битного кода, какой из языков ей нужен, или 0 по умолчанию. Я полагаю, что большинство утилит ищет только первый язык. Все строки представлены в юникоде.

Вы можете написать простой python для получения кода языка (установите пакет pyusb):

#!/usr/bin/python
import usb.core
import usb.util
import usb.control

def getlangs(dev): # from /usr/lib/python2.7/site-packages/usb/util.py
        # Asking for the zero'th index is special - it returns a string
        # descriptor that contains all the language IDs supported by the device.
        # Typically there aren't many - often only one. The language IDs are 16
        # bit numbers, and they start at the third byte in the descriptor. See
        # USB 2.0 specification section 9.6.7 for more information.
        # Note from libusb 1.0 sources (descriptor.c)
        buf = usb.control.get_descriptor(dev, 254, usb.util.DESC_TYPE_STRING, 0)
        assert len(buf) >= 4
        langid = buf[2] | (buf[3] << 8)
        return langid

for dev in usb.core.find(find_all=True):
    try:
        print usb.util.get_string(dev, dev.iManufacturer) # ,langid=0x409
        print " first language code 0x%x" % getlangs(dev)
    except usb.core.USBError:
        pass

0
23.08.2018, 00:51
2 ответа

Вы можете использовать комбинацию find с регулярным выражением, чтобы сузить список файлов-кандидатов до нужного вам диапазона дат, а затем передать результат в grep. Измените часть регулярного выражения, содержащуюся в скобках, чтобы изменить диапазон дат. Пример:

$find. -type f -regextype posix-extended -regex '.*Logger.2018-08-((0[4-9])|(1[0-7])){1}.*' -exec grep -l text '{}' \; | sort -n -t- -k3

./Logger.2018-08-04_23:59:59.csv
./Logger.2018-08-05_23:59:59.csv
./Logger.2018-08-06_23:59:59.csv
./Logger.2018-08-07_23:59:59.csv
./Logger.2018-08-08_23:59:59.csv
./Logger.2018-08-09_23:59:59.csv
./Logger.2018-08-10_23:59:59.csv
./Logger.2018-08-11_23:59:59.csv
./Logger.2018-08-12_23:59:59.csv
./Logger.2018-08-13_23:59:59.csv
./Logger.2018-08-14_23:59:59.csv
./Logger.2018-08-15_23:59:59.csv
./Logger.2018-08-16_23:59:59.csv
./Logger.2018-08-17_23:59:59.csv

В этом случае я использовал параметр grep " -l" для отображения результирующих файлов вместо фиктивного текста, чтобы показать, что это действительно ограничивает grep нужными файлами. Чтобы увидеть текстовую строку grep, удалите «-l». Я также добавил дополнительный конвейер для сортировки, чтобы сделать вывод более красивым.

PS Я нашел сайт regex101 полезным для изучения регулярных выражений.

0
28.04.2021, 23:43

У вас есть bashс "расширенным сопоставлением с образцом"? Попробуйте

shopt -s extglob
ls -la Logger.2018-08-@(0[4-9]|1[0-7])*.csv 
1
28.04.2021, 23:43

Теги

Похожие вопросы