在Linux中批量重命名文件

时间:2013-11-30 14:49:00

标签: linux sed centos rename

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

exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav

我想删除exten-& -G6546525.1。文件名的“exten-”部分在所有文件中都相同,但-G6546525.1部分在所有文件中都不同。是否有一个脚本可以删除这两个部分,只留下B12345678910-C45679891254-D12345645-E4578981.wav作为文件名?

希望我已经说清楚了。

3 个答案:

答案 0 :(得分:0)

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

这是为了处理指定的文件格式,并且在出现字符串等情况下可能会失败。

答案 1 :(得分:0)

以下是如何使用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命令。

答案 2 :(得分:0)

我使用在我的linux机器上运行的PHP和phpSecLib2进行这种批量工作。

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

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

    <?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!";
?>

上述代码应该只需要很少的更改(用户名/密码和文件夹位置更改)。