批量创建基于部分文件名的文件夹并将文件移动到该文件夹​​中

时间:2013-11-15 02:38:22

标签: windows batch-file directory

我在一个文件夹中有160万(!)个PDF文件。这些文件的名称都与此类似:

LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdf
LAST_FIRST_7-24-1936 Glasses RX 6-1-11_3.pdf

我需要根据文件的第一部分创建一个文件夹,然后将该文件和具有相同文件名第一部分的所有其他文件移动到该文件夹​​中。在这种情况下,该文件夹将命名为“LAST_FIRST_7-24-1936”。该文件夹的名称将始终与文件的第一部分相同,直到该空格。

我想创建将执行此操作的批处理文件。凭借我的基本编程知识,我想出了这个逻辑过程:

1 Take the first file and name it var1
2 Remove everything after the space in var1 and name it var2
3 Create a folder named var2
4 Move the file var1 into the folder var2
5 If there are more files Go to line 1, otherwise end

我不知道这个的正确语法是什么。

我找到了这个链接Need a script to create folders based on file names, and auto move files 我根据该链接制作了这批文件

pushd D:\Data\Medinfo PDFs
for %%F in (*.pdf) do (
  2>nul md "%%~nF"
  >nul move /y "%%~nF*.*" "%%~nF"
)
popd

但是,它不允许我仅从文件名的一部分创建文件夹名称。如果我能想出那部分,我认为它会起作用。 我知道我需要为文件夹名称创建变量,但我不知道如何编辑文件名变量以删除空格后的所有内容。 任何帮助,将不胜感激。只要它在Windows Server 2008 R2中本地运行,我就不反对在PowerShell或其他方面执行此操作。

2 个答案:

答案 0 :(得分:5)

@ECHO OFF
SETLOCAL
SET "sourcedir=c:\sourcedir"
PUSHD %sourcedir%
FOR /f "tokens=1*" %%a IN (
 'dir /b /a-d "*_*_*-*-* *.*"'
 ) DO (  
 ECHO MD %%a
 ECHO MOVE "%%a %%b" .\%%a\
)
POPD
GOTO :EOF

这应该完成所需的任务 - 或至少显示所需的指示。

如果您对发出的命令感到满意,请将sourcedir设置为所需的根目录,然后删除要激活的两个echo关键字。

"目录已经存在" MD尝试重新创建现有目录时生成的消息可以通过将2>nul附加到MD行来取消。

同样,可以通过将>nul附加到MOVE行来抑制移动一个文件的报告。

2>nul会抑制错误消息(尝试创建现有目录是一个错误),而“'”文件移动了' message是一条普通的输出消息,因此存在差异。


附录 - 它是如何运作的。

首先,PUSHD将当前目录设置为目标 DIR命令输出由FOR/F标记。 tokens=1*子句指示将第一个标记(1)分配给指定的元变量(%%a),并隐式地将第二个标记(*)分配给%%b - 简单地按字母顺序排列。令牌*表示everything after those token numbers explicitly mentioned。没有使用delims子句,因此默认分隔符(SEPARATORS的集合, SPACE ; TAB

DIR的目标是*_*_*-* *.*的掩码,因此只会找到与该掩码相匹配的文件 - 其中 * 表示any number of any characters - 。因为掩码是"quoted",所以空格包含在掩码中。如果没有引号,将指定两个单独的掩码。 /b选项以基本形式生成列表,即仅名称,无标题或摘要。 /a-d选项会抑制可能已安装掩码的任何目录名称。

因此,对于LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdfdir列出LAST_FIRST_7-24-1936 Diagnostic - Topography 11-18-10_1.pdfFOR/F标记为LAST_FIRST_7-24-1936%%aDiagnostic - Topography 11-18-10_1.pdf%%b使用 SPACE 作为分隔符。

然后可以通过重新插入%%a%%b之间的空格来重建文件名。需要引用包含分隔符的任何文件名来对字符进行分组,并表示它们不是分隔元素。移动目标以 \ 终止,以指定"这是目录名。"

POPD恢复原始记录目录。

答案 1 :(得分:0)

这真的帮助了我,我做了一些修改来处理我的数码照片(我是一名摄影师)并称之为批处理文件FolderAndMove。这是我的代码:

@ECHO OFF
SETLOCAL
SET "sourcedir=***PASTE_DIRECTORY_HERE***"
PUSHD %sourcedir%
FOR /f "tokens=1,2,3,4 delims=_" %%a IN (
 'dir /b /a-d "*_*_*_*.*"'
 ) DO (  
 MD %%a_%%b 2>nul
 MOVE "%%a_%%b_%%c_%%d" .\%%a_%%b\ >nul
)
POPD
GOTO :EOF

以下是我为其他摄影师所做的简单描述:

FolderAndMove将获取格式为*_*_*_*.*的文件的文件夹(如LastName_FirstInitial_Event#_Sequence#.JPG),在所选根文件夹中为每个唯一*_*文件前缀创建一个文件夹(在示例中为LastName_FirstInitial) ),并将*_*_*_*.*约定之后的所有文件移动到与其前缀对应的*_*文件夹中。

请注意,文件格式是准确的:变量(*)必须用下划线分隔(〜分段),没有空格,以便FolderAndMove工作。

相关问题