通过在文件中查找字符串重命名文件
Renaming Files from finding a string within the file
我正在尝试根据文件中的字符串重命名 2000 个 txt 文件。
我一直在查看这些链接,但根本不知道从哪里开始。
Rename text files based on multiple strings in their contents
sublime text- "list lines containing 'find' string
在 txt 文件的 LINE 56 上,字符串将始终显示为:
A30,765,0,1,1,2,N,"4596"
在 txt 文件的 LINE 66 上,字符串将始终显示为:
B60,867,0,3,3,8,220,N,"7731853555"
我想将所有文件批量重命名为引号内的任何内容。所以对于这个例子,我希望文件名重命名为:
4596 7731853555.txt
我很感激能得到的任何帮助。提前致谢。
此致,
汤姆
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.txt" '
) DO (
SET "filename=%%a"
FOR /f "tokens=1*delims=[]" %%h IN ('find /v /n "" "%sourcedir%\%%a"') DO (
IF "%%h"=="56" SET "first=%%i"
IF "%%h"=="66" SET "second=%%i"&CALL :rentxt
)
)
)>"%outfile%"
GOTO :EOF
:rentxt
FOR %%p IN (%first%) DO SET "part1=%%~p"
FOR %%p IN (%second%) DO SET "part2=%%~p"
ECHO REN "%sourcedir%\%filename%" "%part1% %part2%.txt"
GOTO :eof
您需要更改 sourcedir
和 destdir
的设置以适合您的情况。
生成定义为 %outfile%
的文件
嗯 - 我很无聊,所以放松几分钟...
为了方便起见,我将目录和文件的名称设置为变量 - 以便在我的 u:
驱动器上测试程序。
如所写,代码应生成它打算在指定为 outfile
的文件中执行的重命名命令列表。这允许您检查文件以确定文件中的数据是否存在任何错误(例如第 56/66 行不符合描述的形式)而无需采取任何措施。
要在准确性测试完成后实际重命名 文件,只需删除 ECHO REN...
行中的 ECHO
关键字即可。这将执行实际重命名而不是简单地报告它。该报告随后变得无关紧要,因此 for...%%a...
之前的单个 (
行可以与 )>"%outfile%"
行一起删除。
首先,for...%%a
对源目录下的*.txt
个文件进行目录列表,依次将找到的文件名赋值给%%a
。 /b
和 /a-d
开关生成基本(仅名称)格式并抑制分别找到的目录名称。
find
搜索文件中 /v
不 匹配 ""
的行(这将是 每 行 - 甚至是空行)和 /n
对方括号内的行进行编号。 for/f
读取 find
输出的每一行,使用 [
和 ]
作为分隔符,因此行号显示为第一个 "token" 到 %%h
和行内容作为第二个标记 (%%i
).
然后select第56行和第66行变成单独的变量,注意filename
包含土豆。
当找到第 66 行时,我们调用子例程 :rentxt
,它分别处理来自第 56 行和第 66 行的 first
和 second
中的字符串。由于每一行由一系列以逗号分隔的字符串组成,而逗号是一个分隔符,变量 part*
依次分配给这些字符串中的每一个,因此 for
循环以分配给最后一个变量结束part*
。 ~
可以方便地删除任何括起来的引号。
然后,由于我们现在将部分行和原始文件名安全地保存在变量中,所以我们需要做的就是构建重命名指令,然后 - echo
它用于验证,或者使用 echo
删除,重命名文件。
PowerShell 脚本,更改 Pushd 路径以适应您的环境
## Q:\Test18\SO_50182439.ps1
Pushd "X:\path\to\files"
Get-ChildItem *.txt | ForEach-Object {
$txtFile = Get-Content $_
If ($txtFile.Count -ge 66){
$NewName = $txtfile[55].split(',')[-1].Trim().Trim('"')+" "+
$txtfile[65].split(',')[-1].Trim().Trim('"')+$_.Extension
$_ | Rename-Item -NewName $NewName
}
}
PopD
- 脚本迭代 txt 文件,将内容读入 var
$txtFile
- 检查内容至少有 66 行
- 在逗号处拆分第 55 行和第 65 行(从零开始)
- 获取最后一个元素并将其从 space 和双引号
中删除
- 在中间加上 space 并附加扩展名
- 终于重命名了。
我正在尝试根据文件中的字符串重命名 2000 个 txt 文件。 我一直在查看这些链接,但根本不知道从哪里开始。
Rename text files based on multiple strings in their contents sublime text- "list lines containing 'find' string
在 txt 文件的 LINE 56 上,字符串将始终显示为: A30,765,0,1,1,2,N,"4596"
在 txt 文件的 LINE 66 上,字符串将始终显示为: B60,867,0,3,3,8,220,N,"7731853555"
我想将所有文件批量重命名为引号内的任何内容。所以对于这个例子,我希望文件名重命名为:
4596 7731853555.txt
我很感激能得到的任何帮助。提前致谢。
此致, 汤姆
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
SET "outfile=%destdir%\outfile.txt"
(
FOR /f "delims=" %%a IN (
'dir /b /a-d "%sourcedir%\*.txt" '
) DO (
SET "filename=%%a"
FOR /f "tokens=1*delims=[]" %%h IN ('find /v /n "" "%sourcedir%\%%a"') DO (
IF "%%h"=="56" SET "first=%%i"
IF "%%h"=="66" SET "second=%%i"&CALL :rentxt
)
)
)>"%outfile%"
GOTO :EOF
:rentxt
FOR %%p IN (%first%) DO SET "part1=%%~p"
FOR %%p IN (%second%) DO SET "part2=%%~p"
ECHO REN "%sourcedir%\%filename%" "%part1% %part2%.txt"
GOTO :eof
您需要更改 sourcedir
和 destdir
的设置以适合您的情况。
生成定义为 %outfile%
的文件嗯 - 我很无聊,所以放松几分钟...
为了方便起见,我将目录和文件的名称设置为变量 - 以便在我的 u:
驱动器上测试程序。
如所写,代码应生成它打算在指定为 outfile
的文件中执行的重命名命令列表。这允许您检查文件以确定文件中的数据是否存在任何错误(例如第 56/66 行不符合描述的形式)而无需采取任何措施。
要在准确性测试完成后实际重命名 文件,只需删除 ECHO REN...
行中的 ECHO
关键字即可。这将执行实际重命名而不是简单地报告它。该报告随后变得无关紧要,因此 for...%%a...
之前的单个 (
行可以与 )>"%outfile%"
行一起删除。
首先,for...%%a
对源目录下的*.txt
个文件进行目录列表,依次将找到的文件名赋值给%%a
。 /b
和 /a-d
开关生成基本(仅名称)格式并抑制分别找到的目录名称。
find
搜索文件中 /v
不 匹配 ""
的行(这将是 每 行 - 甚至是空行)和 /n
对方括号内的行进行编号。 for/f
读取 find
输出的每一行,使用 [
和 ]
作为分隔符,因此行号显示为第一个 "token" 到 %%h
和行内容作为第二个标记 (%%i
).
然后select第56行和第66行变成单独的变量,注意filename
包含土豆。
当找到第 66 行时,我们调用子例程 :rentxt
,它分别处理来自第 56 行和第 66 行的 first
和 second
中的字符串。由于每一行由一系列以逗号分隔的字符串组成,而逗号是一个分隔符,变量 part*
依次分配给这些字符串中的每一个,因此 for
循环以分配给最后一个变量结束part*
。 ~
可以方便地删除任何括起来的引号。
然后,由于我们现在将部分行和原始文件名安全地保存在变量中,所以我们需要做的就是构建重命名指令,然后 - echo
它用于验证,或者使用 echo
删除,重命名文件。
PowerShell 脚本,更改 Pushd 路径以适应您的环境
## Q:\Test18\SO_50182439.ps1
Pushd "X:\path\to\files"
Get-ChildItem *.txt | ForEach-Object {
$txtFile = Get-Content $_
If ($txtFile.Count -ge 66){
$NewName = $txtfile[55].split(',')[-1].Trim().Trim('"')+" "+
$txtfile[65].split(',')[-1].Trim().Trim('"')+$_.Extension
$_ | Rename-Item -NewName $NewName
}
}
PopD
- 脚本迭代 txt 文件,将内容读入 var
$txtFile
- 检查内容至少有 66 行
- 在逗号处拆分第 55 行和第 65 行(从零开始)
- 获取最后一个元素并将其从 space 和双引号 中删除
- 在中间加上 space 并附加扩展名
- 终于重命名了。