Имя папки для изменения партии, прочитав строку из текстового файла

У меня много папок имеют файл .txt. Этот файл .txt имеет многострочную линию и есть строка, подобная этой

SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address

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

Если у нас есть эта строка вверх в папке с именем (A), я хочу, чтобы пакет читал имя@company.com и переименовал папку (A).

его будет выглядеть следующим образом (найдите *@*.* в файле file.txt/первый адрес электронной почты для поиска пакетов если u find → переименовать папку в любое имя)

Ответ 1

Это не проверено, но я считаю, что это сработает:

@echo off
pushd "your root location"
for /f "tokens=1* delims=:" %%A in (
  'findstr /srbc:"SMTP_Email_Address  *type=SZ  *[^ ][^ ]*@[^ ][^ ]*\.[^ ][^ ]*  *SMTP_Email_Address" filel.txt^|sort /r'
) do if exist "%%A" for %%F in ("%%A\..") do (
  for /f "tokens=3" %%N in ("%%B") do ren "%%~fF" "%%N"
)
popd

Опция FINDSTR/S выполняет поиск файла "file.txt" во всех дочерних папках для линий адресов электронной почты. Полный путь к файлу привязан к каждой найденной строке. SORT/R заставляет дочерние папки указываться перед родителями. Это важно, поэтому мы не пытаемся переименовать дочернюю папку после того, как родитель был переименован.

IF EXIST "%% A" предотвращает любую попытку переименования папки после того, как она уже была названа (папка переименована в первый найденный адрес электронной почты).

Самый внешний FOR/F разбивает найденные строки на путь "file.txt" и строку текста. Следующий FOR извлекает родительскую папку файла, а последний FOR извлекает адрес электронной почты.

script, конечно, не сможет переименовать вторую папку, если один и тот же адрес электронной почты появится в нескольких папках.

Ответ 2

Перед выполнением oneliner:

sgeorge-mn:stack sgeorge$ ls -l
total 0
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 fol1
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 fol2
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 fol3

sgeorge-mn:stack sgeorge$ cat */file.txt
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )

Oneliner:

sgeorge-mn:stack sgeorge$ for i in `ls -1`; do NAME=`awk '{ print $3}'  $i/file.txt | awk -F\@ '{ print $1}'` && mv $i $NAME ; done

После выполнения oneliner:

sgeorge-mn:stack sgeorge$ ls -l
total 0
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 abc
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 lmn
drwxr-xr-x  3 sgeorge  wheel  102 Jan  6 14:18 xyz

sgeorge-mn:stack sgeorge$ cat */file.txt
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )
SMTP_Email_Address type=SZ [email protected] SMTP_Email_Address )