2017-05-29 93 views
1

我有以下的文件和文件夹结构(使用真实姓名):如何将特定文件从多个子文件夹移动到其各自的父文件夹? (Windows批处理)

Carabidae/Pterostichinae/FolderNameXXX/dor/StackXXX/files.tif 

我的问题是,我需要一个特定的文件,PM *,从StackXXX文件夹到他们。各自/ dor父文件夹。 StackXXX文件夹然后可以被删除。

有数百个FolderName。理想情况下,我想要一个批处理文件,我可以从Carabidae文件夹运行。

这需要是一个批处理文件,因为会不断增加新的FolderNames。

很多搜​​索后,我发现了一个半工作解决方案从this StackOverflow answer

for /f "delims==" %%i in ('dir /a:d /b') do for /f "delims==" %%f in ('dir %%i /a:d /b') do (move "%%i\%%f\PM*.*" "%%i"&&rd "%%i\%%f" /s /q) 

它移动的文件,并删除该文件夹,就像我想要的。但问题是,它只能在从FolderName文件夹运行时起作用,这会影响脚本的节省时间的目的。我不知道如何修改它以递归到子文件夹中,以便我可以从顶层文件夹运行它。

非常感谢您的帮助!

+0

'for/r'可以帮助你... – SteveFest

+0

我也这么认为,但它不适用于这行代码。我试着将'for/f'和每一个分开替换,并没有在任何时候工作...... – trilobutt

+0

你知道'for/r'的工作方式吗?请检查https://ss64.com/nt/for_r.html以获取更多信息和使用方法 – SteveFest

回答

1

这里是一个可能的解决方案,因为只有XXX部分的路径样本中是可变的:

rem // Enumerate `FolderName*` directories: 
for /D %%R in ("Carabidae\Pterostichinae\FolderName*") do (
    rem // Enumerate `Stack*` sub-directories within `dor` sub-directories: 
    for /F "delims= eol=|" %%D in ('dir /B /A:D "%%~R\dor\Stack*"') do (
     rem // Check for `PM*.*` files in `Stack*` sub-directories: 
     (
      rem // Enumerate `PM*.*` files: 
      for /F "delims= eol=|" %%F in ('dir /B /A:-D "%%~R\dor\%%D\PM*.*"') do (
       rem /* Move `PM*.*` file one directory level up, overwriting 
       rem an already existing file, if applicable: */ 
       ECHO move /Y "%%~R\dor\%%D\%%F" "%%~R\dor\%%F" 
      ) 
     ) && (
      rem /* Remove `Stack*` sub-directory after file movement; 
      rem this is skipped if no `PM*.*` files have been found in the `Stack*` 
      rem sub-directory, so when the `for /F %%F` loop did never iterate: */ 
      ECHO rd /S /Q "%%~R\dor\%%D" 
     ) 
    ) 
) 

已经成功地测试是否被返回正确的项目后,删除大写case ECHO命令实际移动PM*.*文件并删除Stack*目录!

2
@ECHO OFF 
SETLOCAL 
SET "sourcedir=u:\Carabidae" 
FOR /f "tokens=1*delims=" %%a IN (
'dir /b /s /a-d "%sourcedir%\pm*.*" ' 
) DO IF EXIST "%%a" (
FOR %%p IN ("%%~dpa..\.") DO IF /i "%%~nxp"=="dor" (
    ECHO %%a|FINDSTR /i "\\dor\\Stack" >NUL 
    IF NOT ERRORLEVEL 1 (
    ECHO MOVE /y "%%~dpa\pm*.*" "%%~dpa..\" 
    ECHO RD /s /q "%%~dpa" 
) 
) 
) 

GOTO :EOF 

您需要更改sourcedir的设置以适合您的情况。

找到所有的pm*.*文件,文件名以%%a

确保父目录是dor并确保\dor\stack\是路径。如果是这样,移动文件并删除目录。

如果目标目录包含多个pm*.*文件,则if exist门确保不打嗝。

所需的MOVE命令仅为ECHO用于测试目的。 确认命令正确后,将ECHO(MOVE更改为MOVE以实际移动文件。追加>nul以抑制报告消息(例如,1 file moved

为了测试目的,所需的RD命令仅仅是ECHO确认命令正确后,将ECHO(RD更改为RD以实际删除目录。

move命令末尾添加>nul以根据需要禁止移动报告。

像往常一样,我建议你先测试一个代表性的子树。

+0

对不起,迟到的回复,完成之前我可以完全测试它的工作。它完美运行,并且足够灵活以解决文件夹名称中的任何不一致问题。非常感谢你! – trilobutt

相关问题