我在名为“Phone Recordings”的目录中有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
任何帮助都会很棒,我认为我正在朝着错误的轨道前进...也可以在Windows命令行上使用RegEx吗?
答案 0 :(得分: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
这应该让你前进。
您需要设置sourcedir
和destdir
以适合您的系统。
它会从您指定的两个扩展程序的源目录生成基本(仅限文件名)形式的dir
列表,并标记为%%a
和%%b
。 %%a
获取括号之间的部分,%%b
获取名称的其余部分。
%%b
和空格分析 -
,以便将第三个标记年份分配给%%i
然后创建目录并将源文件移动到该目录。
当前批次只会列出建议的命令。删除ECHO
以激活。
请注意,将2>nul
附加到MD
行会抑制为第二次和后续尝试创建目录而生成的错误消息(因为它是在第一次遇到名称+年时创建的。 )
将>nul
添加到move
行会取消1 file moved
报告。
答案 1 :(得分: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
答案 2 :(得分: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>';
}
}
}
?>