根据文件名取消目录结构

时间:2013-08-11 03:13:30

标签: batch-file

这是此问题中描述的“扁平”操作的反转:Flattening a directory

我想要一个批处理脚本,它将遍历“flattened”目录中的每个文件并将它们放回原始目录中,根据需要创建目录

因此,如果我的文件夹中包含以下文件:

images-nature-dcim001.jpg
images-nature-dcim002.jpg
images-dcim003.jpg
images-indoors-dcim004.jpg

它将生成结果目录结构,创建目录并将文件移动(或复制)到正确的文件夹中。

images
  dcim003.jpg
  nature
    dcim001.jpg
    dcim002.jpg
  indoors
    dcim004.jpg

注意:该示例使用连字符分隔目录,但它们可以是任何字符。

3 个答案:

答案 0 :(得分:2)

@ECHO OFF &SETLOCAL
FOR /f "delims=" %%a IN ("%cd%") DO SET "precur=%%~dpa"
FOR /f "delims=" %%a IN ('dir /b /s /a-d *.txt') DO (
    SET "fname=%%~fa"
    SETLOCAL ENABLEDELAYEDEXPANSION
    SET "nname=!fname:%precur%=!"
    SET "nname=!nname:\=-!"
    ECHO REN "!fname!" "!nname!"
    ENDLOCAL
)

答案 1 :(得分:2)

这可以在这里工作。它在顶部创建了四个文件,然后移动它们。

@echo off
type nul >images-nature-dcim001.jpg
type nul >images-nature-dcim002.jpg
type nul >images-dcim003.jpg
type nul >images-indoors-dcim004.jpg

for %%a in (*.jpg) do call :routine "%%a"
pause
goto :eof
:routine
set "a=%~1"
set "b=%a:-=\%"
for %%b in ("%b%") do (
md "%%~pb" 2>nul
move "%a%" "%%~pb\%%~nxb"
)

答案 2 :(得分:0)

这是我根据foxidrive获取目录名称的方法使用的版本。我没想到只是用反斜杠替换分隔符。

@echo off
Setlocal EnableDelayedExpansion
rem // Directory Unflatten
rem //   recursively unflattens directories
rem //   and prepends the directory name to
rem //   the filename

rem // Configuration options
rem // * Files to search for
set pattern=*jpg;*.png  
rem // * Directory name delimiter
set delim=-

rem // Perform moving
for %%X in (%pattern%) do (
  set A=%%X

  rem // Replace delimiter with back-slash
  set b=!A:%delim%=\!

  rem // Not sure how to clean this up
  for %%B in ("!b!") do (
    if not exist %%~pB (
      md "%%~dpB"
    )
    move "!A!" "%%~dpB%%~nxB"
  )
)