Перебрать все строки в файле и удалить все файлы, содержащие эту строку в своем содержимом

Расширение пути с помощью *не работает в двойных кавычках.

Можно попробовать так:

#!/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
1
31.01.2020, 21:17
2 ответа

Наивным подходом было бы (предположение об утилитах 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в виде списка слов , которые можно найти где угодно в файлах, мы сначала преобразуем список поиска с помощью команды stream editor в префикс каждая строка с "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:для файлов, которые должны быть удалены.

1
28.04.2021, 23:25

Используя следующий скрипт:

#!/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 и удалим его.

0
28.04.2021, 23:25

Теги

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