【问题标题】:batch change folder name by read line from text file通过从文本文件中读取行批量更改文件夹名称
【发布时间】:2013-01-06 08:41:39
【问题描述】:

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

SMTP_Email_Address type=SZ name@company.com SMTP_Email_Address

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

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

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

【问题讨论】:

    标签: batch-file cmd


    【解决方案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 提取电子邮件地址。

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

    【讨论】:

    • 不工作对不起 - 如果我有 @ 和 dot 这是一封电子邮件,这是我想要的文件夹名称,我怎么不能告诉批次
    • 我想这就是我想要的 .. 但需要修复请
    • @Hauari - 我不明白你的第一条评论。我不明白什么不起作用。我编辑了正则表达式以验证地址具有*@*.* 格式,没有任何空格。
    • 非常感谢 :) 但让我问一下最后一个问题:如果我有这样的 xml 代码 a@a.com/HTTPMail_User_Name> 我怎么能但它在同一批次,因为这个标志 > 我认为需要一些不同的东西 - 我可以将代码更改为:'findstr /srbc:"SMTP_Email_Address type="SZ"> *[^ ][^ ]*@[^ ][^ ] *\.[^][^] *
    • 您创建的批处理仅适用于 1 个文件夹 - 您必须多次运行才能更改文件夹名称 - 每个文件夹都需要您再次运行批处理 - 非常感谢
    【解决方案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 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 )
    

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

    【讨论】:

    • 哦..你想要批处理代码。抱歉,是我的错。我忽略了,以为你想要 bash。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多