基于文件名中的唯一标识符创建文件夹

时间:2016-04-23 09:55:24

标签: batch-file cmd command

我需要一些帮助。我一直在网上搜索这个论坛但到目前为止找不到解决办法。

我有数千张图片,我想根据文件名中的唯一标识符移动到文件夹中。它们都具有如下相同的结构:

ID - 1234 - blahblahblah - 0001234.jpeg
ID - 1234 - blahblahblah - 0001235.jpeg
ID - 1234 - blahblahblah - 0001236.jpeg
ID - 2345 - bloobloobloo - 0001234.jpeg
ID - 2345 - bloobloobloo - 0001235.jpeg
ID - 2345 - bloobloobloo - 0001236.jpeg
ID - 3456 - bleebleeblee - 0001234.jpeg
ID - 3456 - bleebleeblee - 0001235.jpeg
ID - 3456 - bleebleeblee - 0001236.jpeg

我想将以上所有文件移到以下文件夹中(在这种情况下,每个文件夹中有三个文件)

ID - 1234 - blahblahblah
ID - 2345 - bloobloobloo
ID - 3456 - bleebleeblee

我知道我可以移动并右键单击存储这些图像的父文件夹并运行cmd命令。我用它来批量重命名,但我正在努力移动文件。

下一步是将每个文件夹中的所有文件打印为一个pdf(我有一个可以实现此目的的pdf打印机),这实际上会创建每个文件夹的目录。

我希望你能帮助我:-)

非常感谢, Manpaal Singh

3 个答案:

答案 0 :(得分:2)

如果您想从here为Windows安装awk/gawk,可以轻松完成。

使用

生成您问题中的文件列表
DIR /B *.jpeg > files.txt

然后使用此awk脚本:

awk -F" - " '{dir=$1 " - " $2 " - " $3; file=$4; printf "MKDIR \"%s\"\n",dir; printf "COPY \"%s\" \"%s\\%s\"\n",$0,dir,file}' files.txt

它将生成如下输出:

MKDIR "ID - 1234 - blahblahblah"
COPY "ID - 1234 - blahblahblah - 0001234.jpeg" "ID - 1234 - blahblahblah\0001234.jpeg"
MKDIR "ID - 1234 - blahblahblah"
COPY "ID - 1234 - blahblahblah - 0001235.jpeg" "ID - 1234 - blahblahblah\0001235.jpeg"
MKDIR "ID - 1234 - blahblahblah"
COPY "ID - 1234 - blahblahblah - 0001236.jpeg" "ID - 1234 - blahblahblah\0001236.jpeg"
MKDIR "ID - 2345 - bloobloobloo"
COPY "ID - 2345 - bloobloobloo - 0001234.jpeg" "ID - 2345 - bloobloobloo\0001234.jpeg"
MKDIR "ID - 2345 - bloobloobloo"
COPY "ID - 2345 - bloobloobloo - 0001235.jpeg" "ID - 2345 - bloobloobloo\0001235.jpeg"
MKDIR "ID - 2345 - bloobloobloo"
COPY "ID - 2345 - bloobloobloo - 0001236.jpeg" "ID - 2345 - bloobloobloo\0001236.jpeg"
MKDIR "ID - 3456 - bleebleeblee"
COPY "ID - 3456 - bleebleeblee - 0001234.jpeg" "ID - 3456 - bleebleeblee\0001234.jpeg"
MKDIR "ID - 3456 - bleebleeblee"
COPY "ID - 3456 - bleebleeblee - 0001235.jpeg" "ID - 3456 - bleebleeblee\0001235.jpeg"
MKDIR "ID - 3456 - bleebleeblee"
COPY "ID - 3456 - bleebleeblee - 0001236.jpeg" "ID - 3456 - bleebleeblee\0001236.jpeg"
MKDIR "ID - 3456 - bleebleeblee"
COPY "ID - 3456 - bleebleeblee - 0001236.jpeg" "ID - 3456 - bleebleeblee\0001236.jpeg"

您可以将其保存在BATCH文件中,然后根据需要运行。当然,除了展示它会做什么之外,它什么都不做。

解释命令:

  • -F“ - ”表示将每行上的字段分隔一个空格,后跟一个短划线和一个空格,因此1美元将是您的ID,2美元将是数字,3美元将是“blahblahblah”, $ 4将是JPEG文件名

  • dir只包含输出目录的名称

  • 文件只包含文件名

在Windows上,命令行上的引用很困难,因此将脚本放入awk查找的文件中更容易,而不是希望Windows可以解决并理解单引号和双引号。因此,您可以将以下内容保存在名为script.awk

的文件中
{
  dir=$1 " - " $2 " - " $3                       # Extract directory
  file=$4                                        # Extract filename
  printf "MKDIR \"%s\"\n",dir                    # Create outout directory
  printf "COPY \"%s\" \"%s\\%s\"\n",$0,dir,file  # Copy file to directory
}

并使用

运行它
awk -F" - " -f script.awk files.txt

答案 1 :(得分:2)

假设文件名的(第一个)数字部分始终由四个数字组成,而工作目录是包含*.jpeg文件的目录,以下代码应该适用于您:

for /F "delims=" %%F in ('
    dir /B "ID - ???? - * - *.jpeg"
') do (
    for /F "tokens=1-4 delims=- " %%I in ("%%~F") do (
        > nul 2>&1 md "%%I - %%J - %%K"
        move /Y "%%~F" "%%I - %%J - %%K\%%~F"
    )
)

答案 2 :(得分:0)

可以使用cmd的子字符串功能收集目录名称。我无法想象文件名总是经过严格的格式化,但这就是问题所在。应该为目录创建和移动操作添加错误检查。

SETLOCAL ENABLEDELAYEDEXPANSION

FOR /F "usebackq tokens=*" %%f IN (`DIR /B "ID -*.jpeg"`) DO (
    SET FNAME=%%~f
    SET DNAME=!FNAME:~0,24!

    IF NOT EXIST "!DNAME!" (MKDIR "!DNAME!")
    MOVE /Y "!FNAME!" "!DNAME!" >NUL
)

EXIT /B 0