通过文本文件中的读取行批量更改文件夹名称

时间:2013-01-06 08:41:39

标签: batch-file cmd

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

SMTP_Email_Address type=SZ name@company.com SMTP_Email_Address

并且每个文件中的每封电子邮件都会在此行中被拒绝 我如何阅读电子邮件地址或从文本文件中搜索有关电子邮件的内容,并按此名称重命名该文件夹?

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

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

2 个答案:

答案 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 )