批处理文件 - 折叠多个文件夹中的所有文件,并根据文件夹名称重命名

时间:2015-04-02 05:11:54

标签: batch-file directory batch-rename

我有多个文件夹中的文件,我每月收到所有这些文件,我需要使用这个命名约定将所有文件复制到一个文件夹YYYYMMDD.csv

Current Folder <CRLF>
YYYY\MM\D\ir\external_report.csv

2015\03\1\ir\external_report.csv
2015\03\2\ir\external_report.csv
.
.
.
2015\03\31\ir\external_report.csv

需要在此文件夹中

2015\03\20150301.csv
.
.
2015\03\20150331.csv

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这个问题,可能会有用:

@echo off
setlocal enabledelayedexpansion


for /r C:\2015 %%i in (*.csv) do (
    for /f "tokens=1-3 delims=\ " %%j in ('echo %%~pi') do (
    if %%l lss 10 (
    move "%%i" "c:\%%j\%%k\%%j%%k0%%l%%~xi"
    ) else (
    move "%%i" "c:\%%j\%%k\%%j%%k%%l%%~xi"
    )
    )
)
pause

它应该将所有.csv文件放在父年文件夹中的相关月份文件夹中,并根据您的命名约定重命名它们。您可能需要更改目录/路径以适合您的目录。

答案 1 :(得分:0)

以下内容将移动并重命名位于external_report.csv文件夹层次结构中的当前文件夹下的所有YYYY\MM\D\ir\个文件。它不会移动不在模板层次结构中的external_report.csv个文件。 YYYY文件夹可以位于当前文件夹层次结构中的任何深度。如果移动后它们为空,这也将删除D\ir个文件夹。

for /f "delims=" %%F in (
  'dir /b /s /a-d external_report.csv^|findstr /i "[\\][0-9][0-9][0-9][0-9][\\][01][0-9][\\][0-9][0-9]*[\\]ir[\\]external_report.csv$"'
) do for %%D in (
  "%%F\..\.."
) do for %%M in (
  "%%F\..\..\.."
) do for %%Y in (
  "%%F\..\..\..\.."
) do (
  if %%~nD lss 10 (
    move "%%F" "%%~dpD%%~nY%%~nM0%%~nD.csv
  ) else (
    move "%%F" "%%~dpD%%~nY%%~nM%%~nD.csv
  )
  %= The following will delete the day\ir   =%
  %= folders if and only if they are empty  =%
  2>nul (rd "%%F\.." && rd "%%F\..\..")
)

工作原理。

  • DIR /B /S命令列出了所有external_report.csv个文件的完整路径。

  • 使用正则表达式将结果传送到FINDSTR,该表达式验证文件位于YYYY\MM\D\ir文件夹中。这不是一个完美的验证,但它应该是足够的。

  • FOR /F在循环中迭代结果。

  • 使用额外的FOR循环和\..技巧提取每个日期组件,使层次结构向上移动一级,并使用~n修饰符获取结果基本名称(年,月或日)

  • %= xxxxxxx =%是一种在循环中嵌入注释的安全方法。实际上,它是一个不存在的变量的扩展,这无关紧要。变量不能存在,因为变量名称不能包含=

其余的是直截了当的