PHP批量文件重命名脚本怎么写

后端开发   发布日期:2023年11月10日   浏览次数:533

这篇“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 参数,该参数请谨慎使用,当出现错误时,文件会被覆盖掉且无法恢复,因此非经过严格测试,确保安全情况下不建议使用)

【代码如下】

  1. #!/usr/bin/php
  2. <?php
  3. //【免责声明】请了解怎么使用和正则的情况下谨慎使用,由此造成的任何后果均与本程序及其作者无关
  4. //PHP批量文件重命名脚本(支持正则)
  5. // 格式: rename from to path from是从什么文件名 to是重命名什么文件名 path是哪个文件夹(path可省略,默认为当前文件夹)
  6. // 比如: rename "(d+)(.*).jpg" "{1}.jpg" {1}代表正则的第一个捕获组,{2},{3}以此类推
  7. // rename "(d+).jpg" "{i}.jpg" {i}代表从1开始每个文件增加1,{i10}代表从10开始每个文件加1,{i10+2}代表从10开始加2,{i10-2}代表从10开始减2
  8. // 另外: --rsort代表文件名按倒序处理,默认为正序 --debug代表调试,可以打印出哪个文件将会重命名为什么名称的列表 --help是显示帮助文档
  9. // 默认重命名后的文件在path目录下的renamed目录里,不会重命名原文件,请确认无误后再拷贝(如需重命名在源文件上,请加--force参数,该参数请谨慎使用,当出现错误时,文件会被覆盖掉且无法恢复,因此非经过严格测试,确保安全情况下不建议使用)
  10. if(in_array('--help', $argv)) {
  11. //显示help菜单
  12. help();
  13. exit();
  14. }
  15. //开启调试模式
  16. $debug = 0;
  17. if(in_array('--debug', $argv)) {
  18. unset($argv[array_search("--debug",$argv,true)]);
  19. $debug = 1;
  20. }
  21. //开启覆盖式重命名,默认是拷贝式重命名
  22. $forceCover = 0;
  23. if(in_array('--force', $argv)) {
  24. unset($argv[array_search("--force",$argv,true)]);
  25. $forceCover = 1;
  26. //让用户确认是否使用--force参数,防止误操作
  27. fwrite(STDOUT,'您正在使用--force参数,该参数可能导致文件被覆盖且无法恢复,您确认使用吗?yes使用,no不使用:');
  28. $confirm = strtolower(trim(fgets(STDIN)));
  29. if($confirm != 'yes' && $confirm != 'y') {
  30. //不使用
  31. $forceCover = 0;
  32. }
  33. }
  34. //--rsort把文件按自然排序倒序,默认是按自然排序正序
  35. $sortType = 'sort';
  36. if(in_array('--rsort', $argv)) {
  37. unset($argv[array_search("--rsort",$argv,true)]);
  38. $sortType = 'rsort';
  39. }
  40. //获取命令行参数,建议加“”防止字符被shell解析
  41. $argv = array_values($argv);
  42. $from = $argv[1]??'';
  43. if($from == "*" || $from == "*.*"){
  44. $from = ".*";
  45. }
  46. $to = $argv[2]??'';
  47. //path默认为当前目录
  48. $path = $argv[3]??'';
  49. $path = $path ? rtrim($path, '/') . '/' : '';
  50. if(!$from||!$to){
  51. //参数错误报错并显示帮助
  52. echo "[error] from and to is required.
  53. ";
  54. help();
  55. exit();
  56. }
  57. //遍历所有文件并按自然排序
  58. $files = glob("{$path}*");
  59. if($sortType == 'rsort') {
  60. rsort($files, SORT_NATURAL);
  61. } else {
  62. sort($files, SORT_NATURAL);
  63. }
  64. //匹配$to中{i10+1}字符串
  65. preg_match("#{(?<i>[iI])(?<init>(d+){0,1})(?<op>[+-]{0,1})(?<step>(d+){0,1})}#", $to, $toMatches);
  66. //设置初始值
  67. $init = !empty($toMatches['init']) ? intval($toMatches['init']) : 1;
  68. $count = $init ?: 1;
  69. //遍历所有文件名进行替换处理
  70. foreach ($files as $filename) {
  71. $tofilename = $to;
  72. //替换$to中{i10+1}字符串
  73. if(!empty($toMatches)) {
  74. $tofilename = str_replace($toMatches[0], $count, $tofilename);
  75. }
  76. //替换每个文件名的捕获组(即$from正则中的捕获组)
  77. preg_match("#{$from}#i", $filename, $fromMatches);
  78. if(!empty($fromMatches)) {
  79. foreach($fromMatches as $key => $val) {
  80. //跳过第一个,第一个不是捕获组
  81. if($key > 0) {
  82. $tofilename = str_replace("{{$key}}", $val, $tofilename);
  83. }
  84. }
  85. }
  86. // 根据$to中{i10+1}字符串判断操作方向
  87. if(!empty($toMatches)) {
  88. $step = !empty($toMatches['step']) ? intval($toMatches['step']) : 1;
  89. $op = !empty($toMatches['op']) ? trim($toMatches['op']) : "+";
  90. if($op == "+"){
  91. $count = $count + $step;
  92. } else {
  93. $count = $count - $step;
  94. }
  95. }
  96. //调试时只显示不实际写入
  97. if($debug) {
  98. $tofilename = $path.$tofilename;
  99. echo "$filename => $tofilename
  100. ";
  101. continue;
  102. }
  103. //写入重名名后的文件
  104. if($forceCover){
  105. //覆盖式重命名
  106. rename($filename, $path.$tofilename);
  107. } else {
  108. //拷贝式重命名
  109. if(!file_exists($path.'renamed/')){
  110. mkdir($path.'renamed/',0777,true);
  111. }
  112. copy($filename, $path.'renamed/'.$tofilename);
  113. }
  114. }
  115. function help() {
  116. echo "帮助文档:
  117. ";
  118. echo "格式:rename from to path from是从什么文件名 to是重命名什么文件名 path是哪个文件夹(path可省略,默认为当前文件夹)
  119. ";
  120. echo "列如:rename "(d+)(.*).jpg" "{1}.jpg" {1}代表正则的第一个捕获组,{2},{3}以此类推
  121. ";
  122. echo "列如:rename "(d+).jpg" "{i}.jpg" {i}代表从1开始每个文件增加1,{i10}代表从10开始每个文件加1,{i10+2}代表从10开始加2,{i10-2}代表从10开始减2
  123. ";
  124. echo "另外: --rsort代表文件名按倒序处理,默认为正序 --debug代表调试,可以打印出哪个文件将会重命名为什么名称的列表 --help是显示帮助文档
  125. ";
  126. echo "默认重命名后的文件在path目录下的renamed目录里,不会重命名原文件,请确认无误后再拷贝(如需重命名在源文件上,请加--force参数,该参数请谨慎使用,当出现错误时,文件会被覆盖掉且无法恢复,因此非经过严格测试,确保安全情况下不建议使用)
  127. ";
  128. }

以上就是PHP批量文件重命名脚本怎么写的详细内容,更多关于PHP批量文件重命名脚本怎么写的资料请关注九品源码其它相关文章!