0

我有很多文件夹都有一个file.txt。这个 file.txt 有很多行,有这样一行

SMTP_Email_Address type=SZ name@company.com SMTP_Email_Address

并且每封电子邮件在每个文件的这一行中都与其他电子邮件不同
我如何阅读电子邮件地址或从文本文件中搜索电子邮件并用这个名称重命名文件夹?

如果我们在名为 (A) 的文件夹中有这条线,我希望批量读取 name@company.com 并重命名 (A) 文件夹。

它会是这样的(*@*.*在file.txt/第一个电子邮件地址中查找
,如果你找到则批量查找>>将文件夹重命名为任何名称)

4

2 回答 2

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 提取电子邮件地址。

如果相同的电子邮件地址出现在多个文件夹中,该脚本当然无法重命名第二个文件夹。

于 2013-01-06T17:27:04.203 回答
0

在执行 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 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 )
于 2013-01-06T08:55:06.483 回答