список подкаталогов с некоторым преобразованием имен

Очевидным решением было попросить logstash заключить запись каждого поля в '[] с опцией include_brackets => true', а затем добавить фильтры для обработки этого.

В конце концов, правильный фильтр для импорта данных с учетом строки, поступающей из redis, в /etc/logstash/conf.d/filter.conf :

filter {
  mutate {
    gsub => [
       "message", "{u'", "",
       "message", "': u'", ": [",
       "message", "', u'", "], ",
       "message", "'}", "]"
    ]
  }
  kv {
    source => "message"
    field_split => ", "
    value_split => ": "
    remove_tag => [ "_jsonparsefailure" ]
    include_brackets => true
  }
}
2
26.11.2016, 16:30
2 ответа

Вы можете комбинировать тесты в find с - o означает «или»; неявный оператор между тестами - «и». Например:

subs="$(find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) )"
for d in $subs ; do
  ... do something with "$d" ...
done

Скобки вокруг `-name" -nom1 "-o -name" -nom2 "-o" * -nom3 "необходимо заключить в кавычки, потому что они зарезервированы для оболочки.

Теперь, как замечает don_crissti в комментарии, общая рекомендация - избегать захвата вывода find по двум причинам; во-первых, потому что имена файлов могут содержать пробелы и символы новой строки, а также специальные символы и сын; во-вторых, потому что find по самой своей природе зацикливается на результатах. Лучше всего использовать неявный цикл в find ; см. Почему перебор вывода find является плохой практикой и связанное обсуждение:

find -maxdepth 2 -type d \( \
  -name "*-nom1" -o -name "*-nom2" -o -name "*-nom3" \
\) -exec \
  ... do something with '{}' ...
\;
1
27.01.2020, 22:10

Две вещи, которые я могу придумать

  1. Объединить три вызова find в один

     find -maxdepth 2 -type d \ (-name '* -nom1' -o -name '* - nom2 '-o -name' * -nom3 '\) 
     
  2. Используйте возможность find выполнять команды, чтобы избежать внешнего цикла

     find -maxdepth 2 -type d \ (-name '* -nom1' -o -name '* -nom2' -o -name '* -nom3' \) \ 
     - exec sh -c 'для d ; сделать cd "$ d"; cmd1; cmd2; cmd3; ...; done 'sh {} + 
     
1
27.01.2020, 22:10

Теги

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