中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP批量文件重命名腳本怎么寫

發布時間:2023-03-24 16:34:24 來源:億速云 閱讀:261 作者:iii 欄目:編程語言

這篇“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批量文件重命名腳本怎么寫”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

手机| 沙河市| 金塔县| 神农架林区| 岳阳县| 宁海县| 榆社县| 益阳市| 昔阳县| 广河县| 阜新市| 岚皋县| 金堂县| 邢台县| 安义县| 平乐县| 彰武县| 黄梅县| 德格县| 塔城市| 涿鹿县| 垦利县| 和平县| 湖口县| 自贡市| 长葛市| 秭归县| 余江县| 泽库县| 攀枝花市| 周宁县| 玉环县| 五原县| 澜沧| 云梦县| 敖汉旗| 天峨县| 沁水县| 乡城县| 青海省| 邳州市|