Linux中文件的批重命名

Linux中文件的批重命名,linux,sed,centos,rename,Linux,Sed,Centos,Rename,我有大约1000个文件需要重命名。目前的格式是: exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav 我想删除exten-和-G6546525.1。文件名的“ext-”部分在所有文件中都是相同的,但是-G6546525.1部分在所有文件中都是不同的。是否有脚本删除这两个部分,并将文件名保留为B12345678910-C45679891254-D12345645-E457881.wav 希望我已经说清楚了 for f

我有大约1000个文件需要重命名。目前的格式是:

exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav
我想删除
exten-
-G6546525.1
。文件名的“ext-”部分在所有文件中都是相同的,但是
-G6546525.1
部分在所有文件中都是不同的。是否有脚本删除这两个部分,并将文件名保留为B12345678910-C45679891254-D12345645-E457881.wav

希望我已经说清楚了

for f in "exten-*-G*.wav" ; do
    mv "$f" "$(echo $f | sed 's/exten-\(.*\)-[^-]*\.wav/\1.wav/')"
done

这是为处理指定的文件格式而设计的,在全局字符等情况下可能会失败。

以下是如何使用bash或ksh获取文件名的部分:

$ x="exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav"
$ echo "$x"
exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav

$ y="${x#*-}"
$ echo "$y"
B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav

$ z="${y%-*}"
$ echo "$z"
B12345678910-C45679891254-D12345645-E4578981
要阐明如何使用上述方法重命名文件,请执行以下操作:

for x in *
do
    y="${x#*-}"
    mv -- "$x" "${y%-*}.wav"
done

请注意,其他Shell可能有更简洁的方法,例如,
zsh
有一些强大的构造,一些Shell有一个
rename
命令。

我使用在linux机器上运行的PHP和phpSecLib2进行此类批处理

使用SecLib,将SSH连接运行到要重命名文件的Linux框中,并在文件夹中运行“ls”。然后将文件列表分解为一个PHP数组,然后是一个for-each循环

示例代码如下(假设服务器上的文件位置为/home/user/files/且服务器位置为localhost):


执行此操作的最佳方式取决于您使用的操作系统。sed几乎肯定是错误的方法。因此,请告诉我们操作系统,如果是UNIX,请告诉我们您正在使用的shell。更新标记以匹配。所有文件都在同一文件夹中,还是在不同的子文件夹中?
-G6546525.1
部分有多“不同”?除了数字值之外,它们是一样的吗?首先,非常感谢您的及时回复。我正在使用Cent OS,目前在shell中,但希望稍后运行cron,所有文件都在同一目录中。是的,G6546525.1是随机的。我希望这个可以通过最后一个“-”来删除,你说你是“在壳里”。哪个贝壳?@EdMorton是的,我同意。OP对文件名格式非常具体,所以我假设定义很窄。公平地说,如果有不明显的警告,就值得一提。您可以通过适当地引用shell变量(即
echo“$f”
而不是
echo$f
)和使用printf而不是echo来解决许多问题。谢谢各位,我会尝试一下,让你们知道。frig,我被快速的响应淹没了,但我还没说清楚;这是实际文件名:ext-03333456781-07548994578-20131130-135035-1385819435.41.wav。您可能会发现这是来自freepbx/asterisk的录音。我添加了B、C、D、E、G,最初是为了向大家标识文件名的每一部分。请原谅,我不懂linux,可耻的是,我是在microsoft arena开始我的职业生涯的:(#@user3052324您可以使用Ed的方法构造您想要的文件名,并使用shell
for
进行重命名。@user3052324明白了,我更新了我的答案以使应用程序显式化。或者您可以使用str.split用python编写几乎相同的脚本。这似乎违背了您应该使用ver尝试解析
ls
(谷歌it)的输出,如果我正确理解脚本,它就不会引用
mv
上的文件名,因此会出现各种各样的通配符和其他字符错误。修复-忘记了
(字符串)
mv
部分中的
$key
和更新
$key
$oldfile
。至于解析
ls
,解析
ls
和解析
ls
的输出是有区别的。我已经通过PHP做了很多年了,没有任何问题。Ed,Mbratch&Xarus你已经把我的星期六做好了好多了!非常感谢大家,它现在可以工作了。我已经在我的脚本中实现了Ed的代码,效果很好。Ed请ping我你的paypal;我想做一点捐款。Aiden
    <?php

include('Net/SSH2.php');

$ssh = new Net_SSH2('localhost');
if (!$ssh->login('SSHUSER', 'SSHPASS')) {
                exit('Login Failed');
}

$filelist = $ssh->exec("cd /home/user/files;ls");

$filearray = explode("\n", $filelist);

foreach ($filearray as $key) {

    $newarray = explode("-", $key);
    $newfile = $newarray[1] . $newarray[2] . $newarray[3] . $newarray[4] . ".wav";
    $newfile = (string)$newfile;
    $oldfile = (string)$key;

    $rename = "cd /home/user/files;mv '" . $oldfile . "' '" . $newfile . "'";
    $rename = (string)$rename;
    $runrename = $ssh->exec($rename);
}
echo "Done!";
?>