批量将100个文件夹中的所有文件移到一个文件夹中

时间:2013-10-01 18:56:50

标签: batch-file file-io

我有一个小问题。我不是非常流利的批处理脚本,但我想要变得更好。 我正在尝试让一个脚本在我当前的工作中工作,我们可以使用它来将父项的最后一个子目录中的所有文件移到一个目录中。

需要将带有多余子目录的图像序列移动到一个子目录中以进行效果工作流程

基本上我正在传递100个图像序列:

插曲/影片/镜头/分辨率/ shot.0000001.dpx

我想要一个批处理脚本我可以移动到“素材”文件夹,它会解析它们下面的镜头目录并将图像序列移出分辨率文件夹并将它们直接放入镜头文件夹中,这样结构看起来会更多像这样:

插曲/影片/镜头/ shot.0000001.dpx

这个批次需要在许多实例上重复使用,并且只要足够强大,可以重复使用,无论图像序列的扩展名是什么,或者子文件夹的命名结构是什么。

3 个答案:

答案 0 :(得分:5)

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


*可以替换为*。 *(没有空格)只能抓取文件。
使用%而不是%%在命令行上使用 这将从“影片”下的任何目录中获取。删除第一个for循环并用shot替换%% i的所有出现,只从那里抓取。

答案 1 :(得分:1)

#!/bin/bash
mv Episode/Footage/Shot/*/* Episode/Footage/Shot

或者更多的Fanciness:

#!/bin/bash
echo "Write the file path:" 
read file_path

mv $file_path/*/* $file_path/

这将询问您的路径是什么(这是您的示例中的剧集/素材/镜头)然后查找该路径中的所有文件及其中的所有文件并将它们全部放在路径中。 您也可以修改此项,而不是将文件放在您想要的路径中,而不是添加:

echo "Write the destination file path:"
read file_path2

介于两者之间:读取file_path和mv ... 并改变:

mv $file_path/*/* $file_path

为:

mv $file_path/*/* $file_path2

答案 2 :(得分:0)

真的没有必要经历这么多麻烦 除了PUSHD和POPD命令之外,整个事情可以放在像nephi12那样的一行上。

我为了clairity的缘故把所有东西放在不同的行上,但稍后会在一行中给出两个例子

REM Set working directory
PUSHD C:\Episode\Footage\

REM              Find all the sub directories of the working
REM directory, and if any exist execute the loop below:

For /d %%d in ( *.* ) do (

    REM Move all files inside the subdirectory up one level.
    move /s %%d\*.* %%d\..\.

    REM Delete the directories if they are empty.
    RD /y %%d

)

REM Return to your original working directory.
POPD

上面的代码将当前目录名称推送到堆栈中,并将dirs更改为“素材”。 然后For /d命令获取所有(如果有的话)的子目录,并先将它们一次一个地输入MOVE命令,然后输入删除目录命令。

MOVE /s命令将目录%% d中的所有文件(包括子文件夹中的任何文件)向上移动一级。 接下来,RD /y命令会自动删除现在为空的目录,如果它们不为空,则会导致软错误。

最后一个命令将工作目录返回到它的原始位置,POP离开堆栈的路径。


在一行中,没有PUSHDPOPD命令以及目录清理,它看起来像这样:

单行解决方案:

For /d %%d in ( *.* ) do move /s %%d\*.* %%d\..\.

清理单行解决方案:

要包括清理,只需在&&命令之后和move之前“添加”和命令RD,就像这样:

For /d %%d in ( *.* ) do ( move /s %%d\*.* %%d\..\. & RD /y %%d )

为什么我做了我做过的事。

移动大量文件的最快方法,不是要告诉move移动每个文件的方式和位置,而是使用允许Move通过它来识别的通配符'自己放在哪里。因此,不要让它一次移动一个文件,而是给它外卡,这使得MOVE能够以最快的速度工作。因此,我只将其提供给各个源和目标目录,并说“将所有文件从此处复制到那里”。

一组括号(...)可以容纳,解释器只考虑一行代码。这导致了一组全新的问题,但它允许像%% d这样的特殊变量存在于(对我们来说似乎是多行)多行代码中。我在顶部做到了。后来,我使用另一组括号来显示命令解释器,单行的一部分在FOR语句中,什么不是。

我还使用了一些旧的DOS速记来指定父目录..,它允许我不知道某些东西的确切路径,并且仍然操纵它的父级中的东西。例如,C:\WINDOWS\..C:\C:\WINDOWS\SYSTEM32\..C:\WINDOWS\

您可能会注意到我还使用了文件规范.。这可能是不必要的,但是如果没有我使用它我会遇到足够的麻烦。它只是向MOVE表明我们正在将这些文件移动到文件夹而不是文件。而且,哦,是的,MOVE很乐意将数百个文件移到彼此之上,除了最后一个之外,它们都会被破坏。你可以想象我是如何拥抱.的。

&允许您将多个命令或程序串在一行代码上,并允许我将RD固定到行尾,并且仍然可以访问特殊变量FOR命令已创建。

所以,现在,如果你正在关注,你已经意识到我的第二句话就是一个结果。没有什么可以阻止你将PUSHD && POPD添加到该行的开头和结尾。