【问题标题】:batch move file based on first few text on filename根据文件名上的前几个文本批量移动文件
【发布时间】:2019-12-25 21:04:05
【问题描述】:

我试图根据作者姓名移动我的文件(书籍)。 例如:

[author] Title 1.pdf
[author2] Title A.pdf

我为此找到了一个批处理脚本

@echo off
for %%i in (*) do (
 if not "%%~ni" == "organize" (
  md "%%~ni" && move "%%~i" "%%~ni"
 )
)

它可以工作,但它为每个文件创建了每个文件夹,我想要做的是按作者姓名创建文件夹并将其移动到那里。

注意:所有作者名的文件名中都有“[]”,但创建的文件夹只有作者名,没有“[]”。

请帮忙,我有 4000 多个文件需要排序。

【问题讨论】:

  • 你要找的是for /F loop:for /F "tokens=1* delims=[] eol=]" %%J in ('dir /B /A:-D-H-S "[*]*.pdf"') do for /F "eol= " %%I in ("%%K") do 2> nul md "%%J" & move "[%%J]%%K" "%%J\%%I"(外部for /F循环提取[]之间的作者部分,内部循环去掉了余数的前导空格)

标签: windows batch-file cmd


【解决方案1】:

以下脚本使用for /F loop 来拆分dir command 收集的文件名:

@echo off
for /F "tokens=1* delims=[] eol=]" %%I in ('dir /B /A:-D-H-S "[*]*.pdf"') do (
    ECHO md "%%I" 2> nul
    ECHO move "[%%I]%%J" "%%I\"
)

如果要创建的目录已经存在,2> nul 部分会隐藏错误消息。

测试正确的输出后,mdmove 命令行中删除大写的ECHO 命令。为避免出现多个 1 file(s) moved. 消息,请将 SPACE + > nul 附加到 move 命令行。


move 命令目标的结尾\ 旨在强制它指向一个目录。设想由于某种原因(例如,缺少访问权限)无法创建目标目录,没有\ 的目标被解释为工作目录中的新文件名,导致无意重命名;使用\ 时,move 命令需要一个现有目录,如果没有找到,则会出现错误。


除了您的代码没有尝试根据需要拆分文件名这一事实之外,还有一个问题:&& operator 仅在前一个成功的情况下才允许执行以下命令;所以当md 失败时,move 不会运行。例如,您有两个具有相同作者的文件,因此在迭代第二个文件时,目标目录已经存在,因为它是在上一次迭代中创建的,因此 md 失败并且相应的文件不会移动。因此,您应该使用无条件的& operator

【讨论】:

  • 谢谢,它有效。但我需要删除 echo 才能真正移动文件
猜你喜欢
  • 2017-06-07
  • 2015-05-29
  • 2016-06-23
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多