LINUX.ORG.RU
ФорумAdmin

grep : множественные шаблоны ...?

 


0

1

Приветствую! Мне надо бы определить какие файлы в текущем каталоге соответствуют некоторым шаблонам, и вывести их список.

попробовал такую конструкцию:

ls -1 | grep -vF "*OPMET*-ia5 | Z_*ana_bwk_na_N*.png| Z_*ana_bwk_dwda*.png| Z_*ana_bwkman_dwdna*| Z_*ana_bwkman_dwdc*| Z_*EDZW*_nwv01*_p00_na_N*WV11.png| \
Z_*EDZW*_nwv01*_p00_nh_N*WV11.png| Z_*nwv01*_hsy_NA*.png| Z_*EDZW_*_htp_na_N_*_WV11SW.png| Z_*_rft_na_*.png| \
Z_*_r12*| Z_*_r24*| Z_*EDZW*_tkb_na*WV12.png| Z_*ecmwf*| Z_*EDZW*meg_26422*.png| ps401-pro_zwk_eu_p_*| \
Z_*EDZW*waf_swc_eur_*_EGRR.png| A_PWDE*EDZW_*.png| Z_*EDZW*egrr_bhv_nt_p_000024_000500*.tiff| \
Z_*EDZW*egrr_bwk_nt_p_000000_000000*.tiff| Z_*grb02-gme_hptuw*.tar| *grb02-lm_lm2* " |tee -a /dwd_ftp_log.txt

но оно, похоже, не принимает во внимание экстеншенов: к примеру в выводе попадаются

Z__C_EDZW_201712110105_gts88,synop_bufr_999999_999999__MW-220.bin
Z__C_EDZW_201712110627_gts88,synop_bufr_999999_999999__MW-221.bin
Z__C_EDZW_201712111131_gts88,synop_bufr_999999_999999__MW-222.bin
Z__C_EDZW_20171220110105_bda01,synop_bufr_999999_999999__MW_966.bin
Z__C_EDZW_20171220110405_bda01,ship_bufr_999999_999999__MW_983.bin
Z__C_EDZW_20171220110537_bda01,synop_bufr_GER_999999_999999__MW_943.bin

хотя в шаблонах на маски EDZW используются только расширения .png и tiff, но никак не .bin...?

пожалуйста, помогите, я уже полдня тут трахаюсь, варианты перебираю и экспериментирую, но ничего хорошего не достиг :((

У тебя -vF в ключах grep-а. -v — отрицание = «вывести все, кроме сматчившегося». -F — интерпретировать выражение как строку. И свои .bin-ы ты получаешь, потому что в их именах нету перечисленных тобой подстрок.

Так что если тебе, скажем, надо вывести файлы, совпадающие с маской *OPMET*-ia2 или Z_*ana_bwk_na_N*.png, то нужно написать правильные регулярные выражения и задать индивидуальные выражение через множественные ключики «-e» — не рекомендую городить портянку из «|»:

ls | grep -e 'OPMET.*-ia2$' -e '^Z_.*ana_bwk_na_N.*\.png$' ...

kawaii_neko
()

Когда ж вы научитесь для примера давать не ваши говноданные, на которых глаза ломать от ненужности для всех остальных кроме ваc? Глядишь по принципу «в хорошем вопросе половина ответа» и увидели б, что на самом деле не так делали. Если вам действительно надо список файлов и вам по душе glob-маски, то так и пишите «ls -1 *.ex1 *.ex2 ...» - делов то.

vodz
()
Ответ на: комментарий от vodz

Когда ж вы научитесь для примера

да кто ж меня, дурака, научит? :\

по вашему совету  - целыми кучами вываливает в результате 
ls:cannot stat *.ex1: no such file or directory

но чтото из файлов по шаблону вроде тоже выводит.
как сии сообщения убрать можно?

да, каталог не всегда содержит файлы соответствующие шаблонам, вестимо...
wisedraco
() автор топика
Ответ на: комментарий от Pyzia

Вместо звёздочки нужно вставить «любой символ в любом количестве» т.е. .*

както туго я соображаю - вместо звёздочки использовать звёздочку?:-O

wisedraco
() автор топика
Ответ на: комментарий от wisedraco

елыми кучами вываливает в результате
ls:cannot stat *.ex1: no such file or directory
да, каталог не всегда содержит файлы соответствующие шаблонам, вестимо...

Это нормально. Оно вываливается в stderr, потому не мешает получить список того, что есть. Загасить «вываливание» тоже просто: 2> /dev/null

както туго я соображаю - вместо звёздочки использовать звёздочку?:-O

Почитайте google: Regular expressions VS Filename globbing

vodz
()
Последнее исправление: vodz (всего исправлений: 1)
Ответ на: комментарий от vodz

гран мерси! просто и изящно! завтра погоняю, проверю, надеюсь сиё решение действительно будет правильно работать... :)

2 kawaii_neko: переписал по вашему, аж умаялся - нифига, «правильный файл» в каталоге есть, но запрос его не показывает... можт, конечно, я чтото напутал, но...

wisedraco
() автор топика
Ответ на: комментарий от Pyzia

всё равно не понял: * и .* - вещи, понятно, разные, и если поставлено * а не .*, то ваш совет ничего хорошего, имхо не даст...?

2vodz: почитаю для общего развития, но если глоббинг - это маски, как у меня в этом исходном примере, а экспрешшны - это как header /^Received$/ /\[195\.129\.5[89]\..*\]/

то экспрешшны - они явно не людьми и не для людей придуманы, имхо. комп должен быть инструментом по возможности простым, элементарным и легкопонятным, а не быть самоцелью и искусственно максимально усложнённым...

wisedraco
() автор топика
Ответ на: комментарий от vodz

кстати, не подскажешь ли ещё, пожалуйста:

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

куда тут присобачить 2> /dev/null?

пробовал, по логике, в конце строки mv $files - нифига.... :\

    while read files; do
        mv $files /stuff/DWD_sorted/
    done <<____
	*OPMET*-ia5 
	Z_*ana_bwk_na_N*.png
	Z_*ana_bwk_dwda*.png
	Z_*ana_bwkman_dwdna*
	Z_*ana_bwkman_dwdc*
	Z_*EDZW*_nwv01*_p00_na_N*WV11.png
	Z_*EDZW*_nwv01*_p00_nh_N*WV11.png
	Z_*nwv01*_hsy_NA*.png
	Z_*EDZW_*_htp_na_N_*_WV11SW.png
	Z_*_rft_na_*.png
____
wisedraco
() автор топика
Ответ на: комментарий от vodz

это "-f" крайне непонятно мне, что делает, но верю и спасибо - так оно да, изящнее выглядит, но всётаки, если можно, я был бы рад за подсказку, как на вышеприведённом примере таки убрать сообщения о ненайденных файлах...?;) спасибо заранее...

wisedraco
() автор топика
Ответ на: комментарий от wisedraco

это "-f" крайне непонятно мне, что делает,

man test

как на вышеприведённом примере таки убрать сообщения о ненайденных файлах

сообщения пишет mv, ему вместо файла подают в качестве аргумента неразвернувшуюся маску. Если оставить за скобками вообще проблемы такого подхода с пробелами в именах, то можно либо вставить в само mv 2> /dev/null, либо тоже самое добавить с [ -f ... ]

vodz
()
Ответ на: комментарий от vodz

мне аж интересно стало:

mv 2> /dev/null $files /stuff/DWD_sorted/

mv $files /stuff/DWD_sorted/ 2> /dev/null

- всё едино, выводит mv: cannot stat 'Z_*ana_bwkman_dwdc*' no such file or directory

хотя - не должен ведь, перенаправление вывода ж должно работать?

чтото я тут сильно непонимаю....:\

wisedraco
() автор топика
Ответ на: комментарий от wisedraco

чтото я тут сильно непонимаю....:\

Я тоже, должно и УМВР.

Кстати, с [-f ... ] в вашем случае как раз работать не будет для маски, где найдётся несколько файлов, так как будет произведена проверка c «file1 file2», что естественно такое не годится.

vodz
()
Ответ на: комментарий от wisedraco

всё едино, выводит mv: cannot stat 'Z_*ana_bwkman_dwdc*' no such file or directory

а 2>&- ?

teod0r 👍
()
Ответ на: комментарий от vodz

сорри, всё работает таки с перенаправлением вывода - эт я, старый дурак, не принял во внимание что после вышеприведённого куска в скрипте у меня идёт похожее, но более мелкое перераспределение по отдельным каталогам - оно то и ругалось. добавил и туда 2> /dev/null, теперь тишина. буду пилить свой мегаскрипт дальше, спасибо за помощь, и удачного дня ! :)

2teodor : - спасибо и тебе, добрый человек! :)

у нас щас снег лежит, щас пошкандыбаю на лисапеде в другой конец города - в интернетмагазин пришёл обод, который я заказал в рамках конверсии лисапеда в электролисапед... надоело педали крутить, да и старость - не радость...:D

wisedraco
() автор топика
Ответ на: комментарий от wisedraco

то экспрешшны - они явно не людьми и не для людей придуманы

Для людей. Обычные люди не так часто ищут ip адреса или полное совпадение строки.

anc ☕☕☕☕☕
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.