我有一个文件夹,里面有几个子文件夹,每个子文件夹包含 10k+ 个小 txt 文件。现在我需要将每个子文件夹中的所有文件合并为一个大 txt 文件,以便进一步处理。
如果我在每个文件夹中手动调用一个批处理,其中仅包含copy *.txt merge.txt /B
所有内容,则可以正常工作。
但是,如果我可以从主程序中调用一个批处理文件,为每个子文件夹执行相同的任务,那么会更好、更简单。我试过了,for /r %%d in (.) do (copy *.txt merge.txt /B)
但没有成功。错误消息是找不到 *.txt,这让我相信我不能只使用通配符,而是需要指定文件。但那些是随机生成的。
您能否帮助我合并这些文件?谢谢
答案1
假设您在 %userprofile%\desktop\Mytext 中有以下 txt 文件
你可以使用这样的方法:
@echo off
Rem put the root path to the txt files here:
set TxtPath=%userprofile%\desktop\MyText
if exist %userprofile%\desktop\merge.txt del %userprofile%\desktop\merge.txt
for /r %TxtPath% %%a in (*.txt) do more "%%a">> %userprofile%\desktop\merge.txt
notepad.exe %userprofile%\desktop\merge.txt
您将在桌面上看到一个名为 merge.txt 的文件,其内容如下:
作为替代方案,此代码:
@echo off
Rem put the root path to the txt files here:
set TxtPath=%userprofile%\desktop\MyText
if exist %userprofile%\desktop\merge.txt del %userprofile%\desktop\merge.txt
for /r %TxtPath% %%a in (*.txt) do (
echo %%~nxa: >> %userprofile%\desktop\merge.txt
more "%%a">> %userprofile%\desktop\merge.txt
echo. >> %userprofile%\desktop\merge.txt
)
notepad.exe %userprofile%\desktop\merge.txt
将生成以下 merge.txt 文件:
答案2
您可以使用where
命令来执行此操作for
循环复制文件/合并 txt 使用cmd/bat
或命令行:
:: for command line ::
cd.>.\merge.txt & for /f tokens^=* %i in ('where /r "." "*.txt"')do copy /b /y .\merge.txt + "%~i" .\merge.txt
:: for cmd/bat file ::
@echo off
cd.>.\merge.txt & for /f tokens^=* %%i in ('%__APPDIR__%where.exe /r "." "*.txt"')do copy /b /y .\merge.txt + "%%~i" .\merge.txt
或者不使用copy
....
@(for /r %i in (*.txt)do type "%~i")>merge.txt
- 但是你也可以尝试这样做
PowerShell
:
Get-ChildItem -recurse -file *.txt | Get-Content | Set-Content merge.txt
:: or, using alias ::
gci -re -file *.txt | gc | sc merge.txt
答案3
我会让for /R
环形解析文件模式而不是copy
命令:
rem // Prepare an empty result file to merge into:
> "merge.txt" rem/
rem // Merge one matching file after another, excluding the merge target file itself:
for /R %%I in ("*.txt") do if /I not "%%~nxI"=="merge.txt" copy "merge.txt" + "%%~I" "merge.txt" /B
for /R
当没有提供明确的根目录时,命令将扎根于当前工作目录。