您好,登錄后才能下訂單哦!
這篇“PHP批量文件重命名腳本怎么寫”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“PHP批量文件重命名腳本怎么寫”文章吧。
PHP批量文件重命名腳本(支持正則)
【使用說明】
格式: rename from to path from 是從什么文件名 to 是重命名什么文件名 path 是哪個文件夾(path 可省略,默認為當前文件夾)
【比如】
rename “(\d+)(.*).jpg” “{1}.jpg” {1} 代表正則的第一個捕獲組,{2},{3} 以此類推
rename “(\d+).jpg” “{i}.jpg” {i} 代表從 1 開始每個文件增加 1,{i10} 代表從 10 開始每個文件加 1,{i10+2} 代表從 10 開始加 2,{i10-2} 代表從 10 開始減 2
【另外】
--rsort 代表文件名按倒序處理,默認為正序 --debug 代表調試,可以打印出哪個文件將會重命名為什么名稱的列表 --help 是顯示幫助文檔
【其他】
默認重命名后的文件在 path 目錄下的 renamed 目錄里,不會重命名原文件,請確認無誤后仔細拷貝(如需重命名在源文件上,請加 --force 參數,該參數請謹慎使用,當出現錯誤時,文件會被覆蓋掉且無法恢復,因此非經過嚴格測試,確保安全情況下不建議使用)
【代碼如下】
#!/usr/bin/php
<?php
//【免責聲明】請了解怎么使用和正則的情況下謹慎使用,由此造成的任何后果均與本程序及其作者無關
//PHP批量文件重命名腳本(支持正則)
// 格式: rename from to path from是從什么文件名 to是重命名什么文件名 path是哪個文件夾(path可省略,默認為當前文件夾)
// 比如: rename "(\d+)(.*)\.jpg" "{1}.jpg" {1}代表正則的第一個捕獲組,{2},{3}以此類推
// rename "(\d+).jpg" "{i}.jpg" {i}代表從1開始每個文件增加1,{i10}代表從10開始每個文件加1,{i10+2}代表從10開始加2,{i10-2}代表從10開始減2
// 另外: --rsort代表文件名按倒序處理,默認為正序 --debug代表調試,可以打印出哪個文件將會重命名為什么名稱的列表 --help是顯示幫助文檔
// 默認重命名后的文件在path目錄下的renamed目錄里,不會重命名原文件,請確認無誤后再拷貝(如需重命名在源文件上,請加--force參數,該參數請謹慎使用,當出現錯誤時,文件會被覆蓋掉且無法恢復,因此非經過嚴格測試,確保安全情況下不建議使用)
if(in_array('--help', $argv)) {
//顯示help菜單
help();
exit();
}
//開啟調試模式
$debug = 0;
if(in_array('--debug', $argv)) {
unset($argv[array_search("--debug",$argv,true)]);
$debug = 1;
}
//開啟覆蓋式重命名,默認是拷貝式重命名
$forceCover = 0;
if(in_array('--force', $argv)) {
unset($argv[array_search("--force",$argv,true)]);
$forceCover = 1;
//讓用戶確認是否使用--force參數,防止誤操作
fwrite(STDOUT,'您正在使用--force參數,該參數可能導致文件被覆蓋且無法恢復,您確認使用嗎?yes使用,no不使用:');
$confirm = strtolower(trim(fgets(STDIN)));
if($confirm != 'yes' && $confirm != 'y') {
//不使用
$forceCover = 0;
}
}
//--rsort把文件按自然排序倒序,默認是按自然排序正序
$sortType = 'sort';
if(in_array('--rsort', $argv)) {
unset($argv[array_search("--rsort",$argv,true)]);
$sortType = 'rsort';
}
//獲取命令行參數,建議加“”防止字符被shell解析
$argv = array_values($argv);
$from = $argv[1]??'';
if($from == "*" || $from == "*.*"){
$from = ".*";
}
$to = $argv[2]??'';
//path默認為當前目錄
$path = $argv[3]??'';
$path = $path ? rtrim($path, '/') . '/' : '';
if(!$from||!$to){
//參數錯誤報錯并顯示幫助
echo "[error] from and to is required.\n";
help();
exit();
}
//遍歷所有文件并按自然排序
$files = glob("{$path}*");
if($sortType == 'rsort') {
rsort($files, SORT_NATURAL);
} else {
sort($files, SORT_NATURAL);
}
//匹配$to中{i10+1}字符串
preg_match("#\{(?<i>[iI])(?<init>(\d+){0,1})(?<op>[+-]{0,1})(?<step>(\d+){0,1})\}#", $to, $toMatches);
//設置初始值
$init = !empty($toMatches['init']) ? intval($toMatches['init']) : 1;
$count = $init ?: 1;
//遍歷所有文件名進行替換處理
foreach ($files as $filename) {
$tofilename = $to;
//替換$to中{i10+1}字符串
if(!empty($toMatches)) {
$tofilename = str_replace($toMatches[0], $count, $tofilename);
}
//替換每個文件名的捕獲組(即$from正則中的捕獲組)
preg_match("#{$from}#i", $filename, $fromMatches);
if(!empty($fromMatches)) {
foreach($fromMatches as $key => $val) {
//跳過第一個,第一個不是捕獲組
if($key > 0) {
$tofilename = str_replace("{{$key}}", $val, $tofilename);
}
}
}
// 根據$to中{i10+1}字符串判斷操作方向
if(!empty($toMatches)) {
$step = !empty($toMatches['step']) ? intval($toMatches['step']) : 1;
$op = !empty($toMatches['op']) ? trim($toMatches['op']) : "+";
if($op == "+"){
$count = $count + $step;
} else {
$count = $count - $step;
}
}
//調試時只顯示不實際寫入
if($debug) {
$tofilename = $path.$tofilename;
echo "$filename => $tofilename\n";
continue;
}
//寫入重名名后的文件
if($forceCover){
//覆蓋式重命名
rename($filename, $path.$tofilename);
} else {
//拷貝式重命名
if(!file_exists($path.'renamed/')){
mkdir($path.'renamed/',0777,true);
}
copy($filename, $path.'renamed/'.$tofilename);
}
}
function help() {
echo "幫助文檔:\n";
echo "格式:rename from to path from是從什么文件名 to是重命名什么文件名 path是哪個文件夾(path可省略,默認為當前文件夾)\n";
echo "列如:rename \"(\d+)(.*)\.jpg\" \"{1}.jpg\" {1}代表正則的第一個捕獲組,{2},{3}以此類推\n";
echo "列如:rename \"(\d+).jpg\" \"{i}.jpg\" {i}代表從1開始每個文件增加1,{i10}代表從10開始每個文件加1,{i10+2}代表從10開始加2,{i10-2}代表從10開始減2\n";
echo "另外: --rsort代表文件名按倒序處理,默認為正序 --debug代表調試,可以打印出哪個文件將會重命名為什么名稱的列表 --help是顯示幫助文檔\n";
echo "默認重命名后的文件在path目錄下的renamed目錄里,不會重命名原文件,請確認無誤后再拷貝(如需重命名在源文件上,請加--force參數,該參數請謹慎使用,當出現錯誤時,文件會被覆蓋掉且無法恢復,因此非經過嚴格測試,確保安全情況下不建議使用)\n";
}
以上就是關于“PHP批量文件重命名腳本怎么寫”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。