8

我有一个小问题。我在批处理脚本方面不是超级流利,但我正在努力变得更好。我正在尝试让一个脚本在我当前的工作中工作,我们可以使用它来将父目录的最后一个子目录中的所有文件向上移动一个目录。

需要将带有多余子目录的运动图像序列传递到效果工作流程的一个子目录中

基本上,我收到了 100 个图像序列:

剧集/素材/镜头/分辨率/shot.0000001.dpx

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

剧集/素材/镜头/镜头.0000001.dpx

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

4

3 回答 3

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 循环并将 %%i 的所有出现替换为 shot 以仅从那里抓取。

于 2013-10-01T19:55:17.090 回答
2
#!/bin/bash
mv Episode/Footage/Shot/*/* Episode/Footage/Shot

或者更多的幻想:

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

mv $file_path/*/* $file_path/

这将询问您路径是什么(在您的示例中为 Episodes/Footage/shot),然后找到该路径中的所有文件以及其中的所有文件并将它们全部放在路径中。如果不是将文件放在您希望它们在不同位置的路径中,您也可以修改它,您可以添加:

echo "Write the destination file path:"
read file_path2

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

mv $file_path/*/* $file_path

到:

mv $file_path/*/* $file_path2
于 2013-10-01T19:06:42.473 回答
0

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

为了清晰起见,我将所有内容放在单独的行中,但稍后将在一行中给出两个示例

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 更改为 Footage。然后该For /d命令抓取所有(如果有的话)素材的子目录,并先将它们一次提供一个到MOVE命令中,然后再输入到删除目录命令中。

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

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


在一行上,没有PUSHDandPOPD命令和目录清理,它看起来像这样:

单线解决方案:

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

带清理功能的单线解决方案:

要包括清理,只需在命令&&之后move和之前“添加” and 命令RD,如下所示:

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

为什么我做了我所做的。

移动一大堆文件的最快方法不是告诉move如何移动每个文件以及移动每个文件的位置,而是使用通配符,它​​可以Move自己弄清楚将它们放在哪里。因此,我没有告诉它一次移动一个文件,而是给它通配符,这样可以MOVE以最快的速度工作。所以我只为它提供单独的源目录和目标目录,并说“将所有文件从这里复制到那里”。

一组括号(...)可以容纳解释器认为的单行代码。这会导致一系列全新的问题,但它允许像 %%d 这样的特殊变量存在于(在我们看来是)多行代码中。我在顶部这样做了。FOR后来,我使用另一组括号来向命令解释器显示语句中单行的一部分,以及不包含的部分。

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

您可能会注意到我还使用了文件规范.。这可能是不必要的,但没有它我已经遇到了足够的麻烦,我使用它。它只是清楚地MOVE表明我们正在将这些文件移动到一个文件夹,而不是一个文件。而且,哦,是的,MOVE很乐意将您的数百个文件放在一起移动,除了最后一个之外,它们都毁了。你可以想象我是如何接受的.

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

所以,现在如果你注意了,你就会意识到我的第二句话是一个谎言。没有什么能阻止您将 aPUSHD &和 a添加& POPD到该行的开头和结尾。

于 2013-10-02T02:16:23.750 回答