Расширение пути с помощью *не работает в двойных кавычках.
Можно попробовать так:
#!/bin/bash
for dir in /var/www/html/*/; do
if pushd "$dir"; then
wp plugin update --all --allow-root
wp core update --allow-root
wp language core update --allow-root
wp theme update --all --allow-root
rse
popd
fi
done
Наивным подходом было бы (предположение об утилитах GNU):
grep -FZlw -f address.list -- *.eml | xargs -r0 rm -f --
Или то же самое, но с длинными параметрами, поддерживаемыми утилитами GNU:
grep --fixed-strings \
--null --files-with-matches \
--word-regexp \
--file address.list \
-- *.eml |
xargs --no-run-if-empty --null \
rm --force --
Но это приведет к удалению файлов, когда адреса будут найдены в любом месте в файле, будь то в заголовках From:
, To:
, Cc:
, Reply-To
или в теле файла. электронной почте или в прикрепленных файлах.
Кроме того, если address.list
содержит doe@example.com
, это также приведет к удалению писем для john.doe@example.com
и doe@example.com.eu
.
Это также предполагает, что адреса электронной почты отформатированы в одном и том же (одном и том же регистре, без кодировки MIME )в address.list
и в eml
файлах.
Если вы точно знаете, как форматируются электронные письма, например, если они всегда будут содержать одно и только одно вхождение строки вроде:
To: address@example.com
Если address@example.com
отформатирован точно так же, как в вашем address.list
, вы можете сделать:
sed 's/^/To: /' address.list | grep -xZFlf - -- *.eml | xargs -r0 rm -f --
Что было бы более надежным.
Вместо передачи address.list
в виде списка слов , которые можно найти где угодно в файлах, мы сначала преобразуем список поиска с помощью команды s
tream ed
itor в префикс каждая строка с "To: "
, чтобы шаблоны фиксированной строки стали To: address@example.com
и использование -x
/ --line-regexp
для этих (вместо -w
/--word-regexp
)для соответствия полному содержимому строк e x
акт. (поэтому To: address@example.com
не соответствует Reply-To: address@example.com.eu
, например ).
Замените rm -f
на grep -H '^To:'
выше, если вместо удаления файлов вы хотите проверить заголовок To:
для файлов, которые должны быть удалены.
Используя следующий скрипт:
#!/bin/bash
email_dir=./emails
unsubscribe_file=./emails/unsubscribe.txt
while IFS= read -r email _; do
files=($(grep -rni "$email" "$email_dir" | grep -v 'unsubscribe.txt'))
if ((${#files[@]}>1)); then
printf '%s\n' "warning: Found multiple files for: $email" "${files[@]}" >&2
elif ((${#files[@]}==1)); then
rm "$(echo "${files[0]}" | awk -F\: '{print $1}')"
fi
done < "$unsubscribe_file"
email_dir
должен быть установлен на путь к каталогу, содержащему электронные письма. unsubscribe_file
следует указать путь к файлу, содержащему электронные письма, от которых нужно отказаться
Цикл while считывает файл отписки и для каждой строки устанавливает переменную email
в первое поле (, которое должно быть единственным полем, но _
уловит все лишнее, если оно существует)
Мы выполним grep во всех файлах каталога email_dir
для этого адреса электронной почты (, который также вернет файл отмены подписки, поэтому мы используем grep, чтобы удалить его из наших результатов. Было бы идеально, если бы это было не в том же каталоге. Однако не забудьте изменить grep -v 'unsubscribe.txt'
, чтобы отразить фактическое имя вашего файла отказа от подписки)
Мы помещаем эти результаты в массив на случай, если имеется более одного результата. В этом случае он выдаст ошибку и ничего не удалит. Если есть только 1 результат, мы извлечем имя файла из вывода grep и удалим его.