在 Synology 中的文件名中重命名带有时间戳的文件

在 Synology 中的文件名中重命名带有时间戳的文件

大量文件已被“重命名”,文件名中带有时间戳。我找不到批量重命名它们的方法。我正在考虑使用像“批量重命名实用程序”这样的批量重命名并使用正则表达式命令,但是我无法创建命令

错误的文件名是:[130bpm] salsaish (2020_11_04 13_32_49 UTC).wav该文件应该是:[130bpm] salsaish.wav

所以被删除的字符串是:(2020_11_04 13_32_49 UTC)。然而,这些字符串可能会根据重命名的时间而改变,文件也可能包含特殊字符。

有没有办法将它们全部重命名?

答案1

在我的上Synology,没有Perl也没有rename。出于安全考虑攻击面,您不应Perl在设备上添加任何内容。有一个插件,但您可以使用 puresh这是默认的 shell(sh链接到bash):

for i in *.wav; do echo mv -- "$i" "${i% (*}.wav"; done

或者代换参数扩展

for i in *.wav; do echo mv -- "$i" "${i// (*)/}"; done

这个使用外壳参数扩展 看:http://mywiki.wooledge.org/BashFAQ/073和 man bash 中的“参数扩展”。另请参阅http://wiki.bash-hackers.org/syntax/pe

% (*

意味着删除 的右侧部分[[:space:]](*作为glob.这不是一个正则表达式

echo当输出看起来令人满意时删除。

答案2

使用 Perl 实现的rename程序(还有另一个程序,rename它是包的一部分util-linux):

$ perl-rename  -n 's, \(.+?\),,' *
[130bpm] salsaish (2020_11_04 13_32_49 UTC).wav -> [130bpm] salsaish.wav

它将以非贪婪的方式删除第一次出现的空格,后跟括号以及它们之间的所有内容。检查新名称是否是您想要的并删除-n以真正执行重命名。

答案3

很抱歉耽误了很长时间,但这是我在 PHP 中使用的代码:

<?php
function getDirContents($dir, &$results = array()) {
    $files = scandir($dir);

    foreach ($files as $key => $value) {
        $path = realpath($dir . DIRECTORY_SEPARATOR . $value);
        if (!is_dir($path)) {
            $results[] = $path;
        } else if ($value != "." && $value != "..") {
            getDirContents($path, $results);
            $results[] = $path;
        }
    }

    return $results;
}

$dir = getDirContents('./DBM5000');

echo '<table equalcells="1">';

foreach($dir as $file)
{
    
    $good_file = preg_replace("/ \([^)]+\)/","", $file);    
    
    $isfile = is_file($good_file);
    
    echo '<tr>';
    echo '<td>'.$file.'</td>';
    echo '<td>'.$good_file.'</td>';
    
    if(pathinfo($good_file, PATHINFO_EXTENSION))
    {
        echo '<td>FILE</td>';
        
        rename($file, $good_file);
        
    }
    else
    {
        echo '<td>DIRECTORY</td>';
    }
    
    echo '</tr>';   
}

echo '</table>';

相关内容