我有很多文件夹都有file.txt。这个file.txt有多行,有一行像这样
SMTP_Email_Address type=SZ name@company.com SMTP_Email_Address
并且每个文件中的每封电子邮件都会在此行中被拒绝 我如何阅读电子邮件地址或从文本文件中搜索有关电子邮件的内容,并按此名称重命名该文件夹?
如果我们在名为(A)的文件夹中有此行,我希望批量读取name@company.com并重命名(A)文件夹。
它会是这样的(在file.txt中查找*@*.*
/批次找到的第一个电子邮件地址
如果你找到>>将文件夹重命名为任何名称)
答案 0 :(得分: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提取电子邮件地址。
如果多个文件夹中出现相同的电子邮件地址,脚本当然无法重命名第二个文件夹。
答案 1 :(得分:0)
在执行一个班轮之前:
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 abc@company.com SMTP_Email_Address )
SMTP_Email_Address type=SZ lmn@company.com SMTP_Email_Address )
SMTP_Email_Address type=SZ xyz@company.com SMTP_Email_Address )
一个班轮:
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 abc@company.com SMTP_Email_Address )
SMTP_Email_Address type=SZ lmn@company.com SMTP_Email_Address )
SMTP_Email_Address type=SZ xyz@company.com SMTP_Email_Address )