0

我在一个名为“电话录音”的目录中有 1000 个这样命名的文件

[Jeff Reese] 10-20-2012 at 19_39_57.amr
[Jessie Tuttle] 11-26-2012 at 17_29_15.amr
[Jody Huth] 10-19-2012 at 19_49_56.amr

更复杂的是,我们的录音系统在 2013 年从 .amr 更改为 .3gp,如下所示:

[Kim DeBouver] 10-21-2013 at 09_47_41.3gp

我还注意到还有其他问题,例如:

[Jason R Tuttle] 10-26-2012 at 17_24_40.amr

更糟糕的是……

[9154323469] 10-24-2012 at 18_38_25.amr

我希望能够运行一个批处理文件或任何其他可能存在的实用程序,以将这些文件中的每一个移动到一个单独的子目录中,如下所示:

\Phone Recordings\[Kim DeBouver]\2012\ (all of the 2012 recordings)
\Phone Recordings\[Kim DeBouver]\2013\ (all of the 2013 recordings)

对于每个名称,他们将拥有自己的文件夹,并且每个名称中的记录日期都有自己的年份。

我不介意在文件夹中有一个批处理文件,只要它在所有其他移动过程中不移动它。

它不需要递归扫描。

当我这样做时,我以为我有一些接近的东西:

for %%f in (*.*) do call :handlefile %%f

:handlefile
set pad=e:\Phone Recordings
for /f  "delims= tokens=1,* " %%a in ("%1 %2 %3") do call :step %%a %%b
echo "%fn%" "%pad%"
@exit /B

:step
if !%2!==!! EXIT /B
if !%2!==!at! EXIT /B
if !%3!==!! EXIT /B
if !%3!==!at! EXIT /B
set pad=%pad%\%1 %2
for /f  "delims=_ tokens=1,* " %%a in ("%1 %2 %3") do call :step %%a %%b
@EXIT /B

任何帮助都会很棒,我想我走错了路……RegEx也可以在Windows命令行上使用吗?

4

3 回答 3

1
@ECHO OFF
SETLOCAL
SET "sourcedir=u:\recordings"
SET "destdir=u:\destdir"
FOR /f "tokens=1*delims=[]" %%a IN (
 'dir /b /a-d "%sourcedir%\*.amr" "%sourcedir%\*.3gp" '
 ) DO (
  FOR /f "tokens=3delims=- " %%i IN ("%%b") DO (
   ECHO MD "%destdir%\[%%a]\%%i"
   ECHO move "%sourcedir%\[%%a]%%b" "%destdir%\[%%a]\%%i\"
  )
)
GOTO :EOF

这应该会让你继续前进。

您需要设置sourcedirdestdir适合您的系统。

dir它从源目录中为您指定的两个扩展生成一个基本(仅文件名)形式的列表,并将其标记为%%a%%b%%a获取括号之间的部分和%%b名称的其余部分。

%%b然后使用进行分析-space因此将第三个标记(年份)分配给%%i

然后创建目录并将源文件移动到该目录。

当前批次将简单地列出建议的命令。删除ECHOs 以激活。

请注意,附加2>nul到该MD行将抑制为第二次和后续创建目录的尝试生成的错误消息(因为它会在第一次遇到名称+年份时创建。)

添加>nul到该move行将禁止1 file moved报告。

于 2013-11-02T14:54:57.453 回答
1

用sed for Windows试试:

dir /b /a-d|sed -r "s/(\[.*\])\s[01][0-9]-[0-3][0-9]-([12][09][7-901][0-9]).*/md \"\1\\\2\"\&move \"^&\" \"\1\\\2\"/e" >nul 2>&1
于 2013-11-02T15:37:00.317 回答
0

谢谢大家的其他选项...我知道我指定了 DOS 批处理文件,并且我已经测试了另一个确实有效的批处理文件,并进行了一些编辑。

由于我更像是一名 PHP 程序员,因此我最终购买了一个名为 ExeOutput for PHP 的程序,这个方便的小工具让我可以在 PHP 中创建一个脚本并在 Windows 中运行它。相当了不起。无论如何,这里是我创建并决定使用的脚本。

注意:如果您更改两个地方的正则表达式以满足您的需要,您可以自己使用它。

<?php
# Open the directory and get files
define('PATH', 'E:/phonetemp');
foreach (find_all_files(PATH) as $file){
    processFiles($file);
}

function find_all_files($dir) {
    $value = '';
    $result = array();
    $root = scandir($dir);
    foreach($root as $value) {
        if($value === '.' || $value === '..') {continue;}
        if(is_file("$dir/$value")) {
            if (preg_match('/(\[[A-Za-z0-9]{2}.*\]\s[0-9]{2}-[0-9]{2}-[0-9]{4}\sat\s[0-9]{2}_[0-9]{2}_[0-9]{2})\.[A-Za-z0-3]{3}/', "$dir/$value")) {
                $result[]="$value";
                continue;
            }
        }
    }
    return $result;
}
function processFiles($file){
    $result = '';
    preg_match('/(\[[A-Za-z0-9].*\])\s([0-9]{2}-[0-9]{2}-)([0-9]{4}).*/', $file, $result);
    # echo '0='.$result[0].' 1='.$result[1].' 2='.$result[2].' 3='.$result[3].'<br />';
    if (is_dir(PATH.'/'.$result[1].'/'.$result[3])) {
        if(rename(PATH.'/'.$result[0], PATH.'/'.$result[1].'/'.$result[3].'/'.$result[0])) {
            echo '<span style="color: green">moved '.$result[0].' to folder '.PATH.'/'.$result[1].'/'.$result[3].' successfully<br /></span>';
        } else {
            echo '<span style="color: red">moving '.$result[0].' to folder '.PATH.'/'.$result[1].'/'.$result[3].' failed<br /></span>';
        }
        if (file_exists(PATH.'/'.$result[0])) unlink(PATH.'/'.$result[0]);
    } else {
        if (mkdir(PATH.'/'.$result[1].'/'.$result[3], 0, true)) {
            if(rename($result[0], PATH.'/'.$result[1].'/'.$result[3].'/'.$result[0])) {
                echo '<span style="color: green">moved '.$result[0].' to folder '.PATH.'/'.$result[1].'/'.$result[3].' successfully<br /></span>';
            } else {
                echo '<span style="color: red">moving '.$result[0].' to folder '.PATH.'/'.$result[1].'/'.$result[3].' failed<br /></span>';
            }
        } else {
            echo '<span style="color: red">Creating Directory '.PATH.'/'.$result[1].'/'.$result[3].' failed<br /></span>';
        }
    }
}
?>
于 2013-11-02T17:22:16.557 回答