本篇文章給大家帶來了關于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 => $tofilenamen"; 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開始減2n"; echo "另外: --rsort代表文件名按倒序處理,默認為正序 --debug代表調試,可以打印出哪個文件將會重命名為什么名稱的列表 --help是顯示幫助文檔n"; echo "默認重命名后的文件在path目錄下的renamed目錄里,不會重命名原文件,請確認無誤后再拷貝(如需重命名在源文件上,請加--force參數,該參數請謹慎使用,當出現錯誤時,文件會被覆蓋掉且無法恢復,因此非經過嚴格測試,確保安全情況下不建議使用)n"; }
登錄后復制
推薦學習:《PHP視頻教程》