我通常会打开父文件夹并进行搜索,*
以便选择子文件夹中的所有文件,但在这种情况下,我有超过 1,000,000 个文件需要排序,因此当我尝试通过 GUI 复制这么多文件时,我的资源管理器经常崩溃。我不确定通过命令提示符或批处理文件这样做会有多有效,但我想值得一试。
我需要做的是
|parent
| |123
| | 123abc.png
| |456
| | 456def.png
| |789
| | 789ghi.png
变成
|parent
| 123abc.png
| 456def.png
| 789ghi.png
是的,我的实际文件结构将文件名的前 3 个字符赋予文件夹名称,如果这可以帮助对这些进行排序的话。
答案1
使用支持/R在命令提示符下:
[FOR /R] 从 [drive:]path 开始遍历文件夹树,并对每个匹配的文件执行 DO 语句。
首先创建一个暂存文件夹外部您要从中移动文件的父文件夹。这将避免可能的循环引用。
在你的情况下,命令看起来应该是这样的:
FOR /R "C:\Source Folder" %i IN (*.png) DO MOVE "%i" "C:\Staging Folder"
如果要将其放入批处理文件,请更改%i
为%%i
。
注意双引号很重要,不要漏掉任何一个。它们确保正确处理任何包含空格的文件名。
移动完成后,您可以根据需要重命名/移动暂存文件夹。
提示:如果你有足够的硬盘空间和时间,你可能想稳妥行事,复制保存文件而不是移动它们,以防万一出现问题。只需将上述命令更改MOVE
为。COPY
答案2
forfiles /s /m *.FILETYPE /c "cmd /c move @file .."
应将指定 FILETYPE 的任何文件移动到其父文件夹中
答案3
这是一些示例代码:
:loop
for /d %%D in (%1\*) do (move "%%D\*" %1\ && rmdir "%%D")
SHIFT
set PARAMS=%1
if not %PARAMS%!==! goto loop
使用此版本,您可以将要从中删除子文件夹的文件夹拖到批处理中,它会将所有文件从子文件夹移动到父文件夹中。我将其用于下载的存档文件,这些文件随机有或没有子文件夹。请注意,它是针对单个子文件夹制作的,具体到我的情况。
当您在脚本上一次拖动多个子文件夹时,“Shift”表示移动到下一个参数。
答案4
还可以使用环境变量 %%~dpi,它指的是文件所在的文件夹。然后,您可以删除尾部的反斜杠,这样就可以获取文件的父文件夹。下面就是这样做的。
SetLocal EnableDelayedExpansion
FOR /R "C:\Source Folder" %%i IN (*.png) DO (
Set "CurrFile=%%~i"
Set "TMPdp=%%~dpi"
Set "ParFldr=!TMPdp:~0,-1!"
@Echo MOVE "%%~i" "!ParFldr!" ) & REM Delete echo to move. Run to test.
! 启用动态扩展,可用于 %%~i 以及 ParFldr。因此 %%~i 可以是 !CurrFldr!这实际上是测试时所必需的,因为某些文件将包含 Batch 不喜欢的字符串。不喜欢的意思是它们会导致脚本失败并退出。我只是为了清楚起见将所有 %%A 更改为 %%i。使用 A 还是小写 i 真的没有区别,重要的是始终使用相同的字母,所以我将每个 %%A 都更改为 %%i。