大量文件已被“重命名”,文件名中带有时间戳。我找不到批量重命名它们的方法。我正在考虑使用像“批量重命名实用程序”这样的批量重命名并使用正则表达式命令,但是我无法创建命令
错误的文件名是:[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>';