Я не уверен, что именно вы пытались (вы не указали ), но я могу заставить два сервера pulseaudio обмениваться данными через многоадресный RTP следующим образом.
Об отправителе,
pacmd load-module module-rtp-send source=name_of_mic_source destination_ip=232.43.211.230 inhibit_auto_suspend=always
где name_of_mic_source
— источник, подключенный к микрофону для тестирования (используйте pamcd list-sources | grep name:
для просмотра имен, игнорируйте угловые скобки ).
На приемнике,
pacmd load-module module-null-sink sink_name=rtpsink
pacmd load-module module-rtp-recv sink=rtpsink sap_address=232.43.211.230
Это создает «нулевой» приемник, который я могу контролировать с помощью pavucontrol
, чтобы убедиться, что шумы, которые я издавал перед микрофоном, проходят. Wireshark проверяет, что пакеты действительно многоадресные.
Также работает без destination_ip
соотв. sap_address
, и в этом случае будет использоваться многоадресная группа 224.0.0.56
по умолчанию. Однако эта группа является локальной по ссылке -, поэтому она не будет маршрутизироваться, и для ее работы оба компьютера должны находиться в одном сегменте.
Это была тестовая установка. Чтобы перенаправить звук от vlc
и т. д., я бы создал нулевой приемник на отправителе, позволил vlc
воспроизводиться в этот приемник, использовал связанный источник rtpsink.monitor
для module-rtp-send
и подключил module-rtp-recv
напрямую к слышимый слив на ресивере.
Я не пробовал это с потоком RTP -, непосредственно созданным vlc
, но если вы опишете свою настройку, я тоже могу это проверить. Если что-то пойдет не так, следует сравнить объявления SDP/SAP с Wireshark, чтобы увидеть, есть ли проблема.
Если я вас правильно понял, это может быть вариантом (, если моя логика верна ). Здесь я предполагаю, что шаблоны уникальны для каждого файла :
.grep -R < file_with_patterns. | cut -d':' -f1 | uniq -d
grep
вернет две строки, если два шаблона совпадают, или только одну, или ни одной. Воспользовавшись этой ситуацией, мы используем uniq -d
, чтобы показать только повторяющиеся результаты имен файлов.
Не совсем одна команда, но:
num_patterns=$( wc -l < patterns_file )
for file in dir/*; do
num_occurrances=$( grep -F -o -f patterns_file "$file" | sort -u | wc -l )
if (( num_patterns == num_occurrances )); then
echo "all patterns in $file"
fi
done
Этот подход не будет работать, если шаблоны являются регулярными выражениями, потому что совпадающий текст, вероятно, не будет уникальным для каждого совпадения.
Предположим, что ./*.txt
соответствует всем файлам, которые вас интересуют, и что вы хотите найти файлы, содержащие все из строк в файле./patterns
(может содержать более двух строк):
#!/bin/bash
pathnames=(./*.txt )
while IFS= read -r pattern; do
for pathname in "${pathnames[@]}"; do
pathnames=( ${pathnames[@]:1} )
if grep -qF -e "$pattern" "$pathname"; then
pathnames+=( "$pathname" )
fi
done
done <./patterns
printf 'Matched: %s\n' "${pathnames[@]}"
Циклическое перебор паттернов. Для каждого шаблона он проверяет его на соответствие всем файлам в массиве pathnames
. Если шаблон совпадает, мы сохраняем текущий путь в массиве, в противном случае он отбрасывается. В конце pathnames
будут содержать только пути, содержащие все шаблоны.
Из-за способа управления массивом pathnames
количество вызовов grep
, сделанных для каждого шаблона, будет уменьшаться по мере того, как отбрасывается все больше и больше файлов.
Команда pathnames=( ${pathnames[@]:1} )
удалит первый (текущий )путь из массива, а pathnames+=( "$pathname" )
вернет его обратно в конец.
Команда grep -qF -e "$pattern" "$pathname"
вернет значение true , если файл $pathname
содержит строку в $pattern
. Мы используем -q
, чтобы сделать grep
тихим, а также заставить его выйти, как только он совпадет с шаблоном в файле. Мы используем -F
для сравнения строк, а не для сопоставления регулярных выражений.
Только потому, что краткий синтаксис sh
мне нравится больше, чем именованные массивы в bash
, вот вариант вышеприведенного для/bin/sh
(позиционные параметры заменяют массив pathnames
):
#!/bin/sh
set --./*.txt
while IFS= read -r pattern; do
for pathname do
shift
if grep -qF -e "$pattern" "$pathname"; then
set -- "$@" "$pathname"
fi
done
done <./patterns
printf 'Matched: %s\n' "$@"