我需要重命名大约1000个文件。目前的格式是:
exten-B12345678910-C45679891254-D12345645-E4578981-G6546525.1.wav
我想删除exten-
& -G6546525.1
。文件名的“exten-”部分在所有文件中都相同,但-G6546525.1
部分在所有文件中都不同。是否有一个脚本可以删除这两个部分,只留下B12345678910-C45679891254-D12345645-E4578981.wav
作为文件名?
希望我已经说清楚了。
答案 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!";
?>
上述代码应该只需要很少的更改(用户名/密码和文件夹位置更改)。