我需要一些帮助。我一直在网上搜索这个论坛但到目前为止找不到解决办法。
我有数千张图片,我想根据文件名中的唯一标识符移动到文件夹中。它们都具有如下相同的结构:
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
答案 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