我是计算机和编程世界的新手。
@echo off
for /l %%i in (1,1,8) do (
for /f "delims=" %%f in ('findstr /mc:" segment %%i "
C:UsersKing_ArthurDesktopfileMyfile_split_filesMyfile_.txt') do (
move "%%f" "segment %%i"
)
)
因此,该程序根据文本文件的内容移动文件,在这种情况下,它会检查txt文件是否有段(1-8)字符串。 但它一次只检查一个文件,我有 10,000 个文件名为 -
Myfile_1.txt,Myfile_2.txt,依此类推,直到Myfile_10000.txt。
好的,所以每个 txt 文件都包含
>KM368312.1 Influenza A virus
(A/swine/Shandong/01/2009(H1N1)) segment 3
polymerase PA (PA) and PA-X protein (PA-X) genes,
complete cds
您可以假设每个文件的第一行都是这样的,除了段部分的范围从段 1 到 段 8。
那么我如何修改它以读取所有文件并将其移动到目的地,在本例中为名为段 1 - 段 8 的文件夹?
我知道 linux 是执行此类操作的更好选择,我正在尝试尽快进行切换。
@ECHO OFF
SETLOCAL
SET "sourcedir=U:sourcedirt w o"
SET "destdir=U:destdir"
for /L %%e in (8,-1,1) do md "%sourcedir%segment %%e"
FOR /f "tokens=1,2,*delims=:" %%a IN (
'findstr /L /c:" segment " "%sourcedir%file*" '
) DO (
call :whatseg %%c
for /L %%e in (8,-1,1) do if errorlevel %%e echo move "%%a:%%b" "segment %%e"&move "%%a:%%b" "segment %%e"
)
GOTO :EOF
:whatseg
if "%~1"=="segment" goto foundseg
shift
goto whatseg
:foundseg
exit /b%2
您需要更改sourcedir
的设置以适合您的情况。该列表使用适合我的系统的设置。
我故意在名称中包含空格,以确保正确处理它们。
findstr
命令在每个文件中查找文本segment
,并生成格式列表fullfilename:linefound
。由于完整文件名包含:
,for/f
将驱动器号分配给%%a
,将路径和文件名分配给%%b
,将行文本分配给%%c
。
然后调用例程:whatseg
,它只是shift
每个令牌,直到找到segment
,然后将errorlevel
设置为以下参数并返回给调用方。
然后,for/L
检查:whatseg
例程返回errorlevel
- 顺序相反,因为if errorlevel
被解释为if errorlevel is n or greater
。当%%e
匹配errorlevel
时,文件被移动,这将返回errorlevel
0,因此只能有 1 个匹配。