2013-11-02 3 views
0

У меня есть 1000-файлов, которые названы так в каталоге под названием «Телефон Recordings»Перемещение файлов на основе файла в разные папки

[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 

Чтобы усложнять нашу систему записи изменились от .amr до .3GP в 2013, как это:

[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, командная строка?

ответ

0

Спасибо, ребята за другие варианты ... Я знаю, что указано DOS Batch файлы и я проверил другой пакетный файл, который сделал работу, с небольшим редактированием.

Поскольку я больше программист на PHP, я закончил покупку программы под названием ExeOutput для 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>'; 
     } 
    } 
} 
?> 
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 список в основной (имени файл-только) форме из исходной директории для двух расширений, которые вы укажете и tokenises в %%a и %%b. %%a получает часть между скобками и %%b остальную часть имени.

%%b затем анализирует с помощью - и пространства поэтому третий маркер, года, назначенного %%i

Затем создайте папку и переместить Исходных_файлы к нему.

Текущая партия просто перечисляет предлагаемые команды. Удалите ECHO s для активации.

Обратите внимание, что добавление 2>nul к строке MD будет подавать сообщение об ошибке, сгенерированное для второй и последующих попыток создания каталога (поскольку оно было бы создано при первом знакомстве с именем + год.)

Добавление >nul в строку move будет подавлять отчет 1 file moved.

+0

Благодарим за это, я сохраню эту возможность для другого использования. Я был довольно хорошим программистом в 80-х ... HAHAHA – SecureLive

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 
Смежные вопросы