背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/data/images/)。后来访问量大了,图片也多了,这样就影响读取效率。所以有个这样的需求,把这些个图片文件移动到多个目录下,这个目录是图片的上传日期(就是文件属性中的修改日期filemtime)组成的。比如2012-12-20的修改日期,那么现在就该放在/data/images/2012/12/20的目录下。

  php有很容易的操作文件的函数,可以方便完成。当然也可以利用shell脚本完成。

  程序思路:遍历这个文件夹/data/images,查出每个文件的修改日期,然后建立这个日期的文件夹,再把该文件移动到日期文件夹的下面。

  查询修改日期的命令,有个stat,如下:可以找到Modify的日期

  

  比如我要找到这个hehe.log的修改日期:2016-03-04   (取得第六行第二列)

# stat hehe.log | awk 'NR==6{print $2}'

  接下来,我再把这个日期搞成这种格式,2016/03/04。

  可以使用sed的替换命令;-F是分隔符;或在命令里写FS="-",但是必须要有BEGIN

#  stat hehe.log | awk 'NR==6{print $2}' | sed 's/-/\//g'
# stat hehe.log | awk 'NR==6{print $2}' | awk -F - '{print $1"/"$2"/"$3}'
# stat hehe.log | awk 'NR==6{print $2}' | awk 'BEGIN{FS="-"}{print $1"/"$2"/"$3}'

  得到这个日期了,shell脚本也就自然出来了:

#/bin/bash

for file in ./*
do
if [[ -f $file ]]
then str=$(stat $file | awk 'NR==6{print $2}' | sed 's/-/\//g')
if [[ ! -d ${str} ]]
then mkdir -p ${str}
fi
mv $file $str
fi
done

顺便说下shell脚本的注意几点:[[  ]]这个判断命令,左右要留有空格。if下写then。$()是取执行结果赋给了变量。${}是取得这个变量的值。比如第7行的$str可以写成${str}。

做测试的时候,想再把新目录下的文件取回来还原。可以执行:find递归找出文件夹下的文件,然后移动到原来的目录下,-i是一行一行执行

# find . -type f | xargs -i  mv {} .

下面利用php脚本实现:

 <?php

 function mvPic($dir) {
$opendir = opendir($dir);
while($file = readdir($opendir)) { if($file != '.' && $file != '..') { $date = date('Y/m/d', filemtime($file));// 取出文件修改日期,格式为2012/11/12
$fullpath = $dir. "/". $date;
if (!is_dir($fullpath)){
mkdir($fullpath, 0777, true);// true必须设置
}
rename($dir."/".$file, $fullpath."/".$file);// 移动文件
}
}
closedir($opendir);
} $dir_name = "/data/images";
mvPic($dir_name);

最新文章

  1. Tomcat7 配置 ssl
  2. centos7 添加svn
  3. Linux常用命令(转)
  4. Python_sklearn机器学习库学习笔记(一)_一元回归
  5. C#中子类与父类的相互转换
  6. &amp;#x开头的是什么编码呢。浏览器可以解释它。如&amp;#20013;&amp;#22269;等同与中文&quot;中国&quot;?
  7. JQuery.Ajax之错误调试帮助信息介绍
  8. 基于visual Studio2013解决算法导论之004随机排列数组
  9. 当你在试衣间试衣服,请你务必想起wait()与notify()
  10. C#的基础数据类型
  11. JAVAEE——Mybatis第二天:输入和输出映射、动态sql、关联查询、Mybatis整合spring、Mybatis逆向工程
  12. 45个值得收藏的 CSS 形状
  13. 多线程深入:让你彻底理解Synchronized(转)
  14. python os.walk()遍历文件夹
  15. Flutter 布局(五)- LimitedBox、Offstage、OverflowBox、SizedBox详解
  16. sql server连接oracle并实现增删改查
  17. centos6下安装php7的memcached扩展
  18. golang的一些基础数据类型转换
  19. linux命令 dirname
  20. ArrayList源码分析笔记(jdk1.8)

热门文章

  1. css3 Box model 与 Box-sizing
  2. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析
  3. Linux笔记(二): WIN 10 Ubuntu 双系统
  4. github版本控制相关
  5. 洗礼灵魂,修炼python(52)--爬虫篇—【转载】爬虫工具列表
  6. JDBC数据类型、Java数据类型、标准sql类型
  7. 关于使用WeUI在IE中提示“font-face 未能完成 OpenType 嵌入权限检查。权限必须是可安装的。”的问题
  8. contains方法
  9. 如何使用C语言的面向对象
  10. Linux结构目录