【问题标题】:Command line move files/folders up in the directory tree命令行在目录树中向上移动文件/文件夹
【发布时间】:2014-09-18 18:07:16
【问题描述】:

我有一个包含一堆子文件夹和文件的文件夹,但结构有点低效。例如:

根文件夹
----EmptyFolder1
--------文件夹1
------------子文件夹1
------------文件1
------------文件2
----EmptyFolder2
--------文件夹2
------------子文件夹2
------------文件3
------------文件4

如何在树中向上移动所有文件夹/子文件夹/文件并消除所有 EmptyFolders,使其看起来更像这样:

根文件夹
----文件夹1
--------子文件夹1
--------文件1
--------文件2
----文件夹2
--------子文件夹2
--------文件3
--------文件4

【问题讨论】:

  • 如果他们都跟随EmptyFolderX 和子文件夹Folder1,你不能,因为你只能在一个目录中有一个名为Folder1 的文件夹,并将它们全部上移一个水平会导致倍数。你能说得更具体点吗?
  • @KenWhite,标记为“Folder1”的确实有唯一的名称。
  • 那么请edit您的问题并指出这一事实。正如所写,这个问题在这方面尚不清楚。 (我不确定你为什么需要一个批处理文件来执行此操作,顺便说一句;它应该是一次性操作,除非你有数千个“EmptyFolderX”项目,否则只需拖动似乎很快/drop 在 Windows 资源管理器中完成此操作。)
  • @KenWhite,我有大约 7,000 个目录需要以这种方式移动。这就是为什么我正在寻找一种自动化的方式来做到这一点。
  • 好的,很公平。是否所有的空文件夹实际上都命名为“thesametext”,后跟一个递增的数字(如“EmptyFolder1”、“EmptyFolder2”或“DummyFolder1”、“DummyFolder2”),还是“空文件夹”每次都不一样?

标签: windows command-line


【解决方案1】:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "sourcedir=U:\sourcedir\t h r e e"

FOR /f "delims=" %%a IN (
 'dir/s/b/a-d "%sourcedir%"'
 ) DO (
 CALL :movefile %%a
)

:loop
SET "zapped="
FOR /d /r "%sourcedir%" %%a IN (.) DO (
 RD "%%a" >NUL 2>NUL
 IF NOT EXIST "%%a" SET zapped=Y
)
IF DEFINED zapped GOTO loop
DIR /s/b/ad "%sourcedir%

GOTO :EOF

:movefile
SET "oldfn=%*"
SET "newfn=!oldfn:%sourcedir%\=!"
SET "newfn=%sourcedir%\%newfn:*\=%"
FOR %%r IN ("%newfn%") DO (
 ECHO MD "%%~dpr"
 ECHO MOVE "%oldfn%" "%newfn%"
)

GOTO :eof

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

注意首先在有代表性的子树上测试!

所需的 MD 命令仅用于测试目的ECHOed。 验证命令正确后,将ECHO(MD 更改为MD 以实际创建目录。附加 2>nul 以抑制错误消息(例如,当目录已存在时)

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

:loop 标签后面的部分删除子树中的所有空目录。当然,这些命令执行不仅仅是显示。

对于包含对cmd 具有特殊含义的符号的文件/目录名,请务必小心谨慎。

【讨论】:

    猜你喜欢
    • 2017-12-20
    • 1970-01-01
    • 2019-12-16
    • 1970-01-01
    • 2011-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多