0

「Phone 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

さらに複雑なことに、当社の記録システムは 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を使用できますか?

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

これで準備が整うはずです。

sourcedirシステムに合わせて設定する必要がありdestdirます。

dir指定した 2 つの拡張子のソース ディレクトリから基本的な (ファイル名のみの) 形式のリストを生成し、と にトークン化%%a%%bます。%%aブラケットと%%b名前の残りの部分の間の部分を取得します。

%%b-を使用して分析されspace、3 番目のトークンである年が割り当てられます。%%i

次に、ディレクトリを作成し、ソースファイルをそこに移動します。

現在のバッチは、提案されたコマンドを単にリストします。s を削除しECHOてアクティブにします。

2>nul行に追加するMDと、2 回目以降にディレクトリを作成しようとしたときに生成されるエラー メッセージが抑制されることに注意してください(最初に名前 + 年に遭遇したときに作成されているため)。

行に追加>nulするとmove、レポートが抑制され1 file movedます。

于 2013-11-02T14:54:57.453 に答える
1

Windows の sed で試してみてください:

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 に答える