背景是这样的:网站一开始访问量比较小,大家就把所有的图片文件上传到一个目录下(比如是/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);

利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下的更多相关文章

  1. 将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下)

    将samba共享目录映射为本地文件夹(百度网盘直接下载到samba共享目录下) 前面淘了一个蜗牛星际的矿机,打算拿来做个个人云盘,就装上了Linux用smb把硬盘共享出来 访问倒是很爽,就是发现下东西 ...

  2. 利用shell脚本实现计划任务功能 V1.2

    2013.05.10  mytask 1.2 主程序休眠时间分成若干小的时间片断分段休眠,避免长时间的休眠不能及时响应系统信号. 2013.05.07 mytask 1.1 昨天发布了mytask1. ...

  3. 利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中

    现有需求:将oracle数据库中的数据准实时同步至某ftp服务器中,以便前端应用能定时从ftp服务器目录中取增量数据 方法:将加工脚本写为存储过程,然后利用shell脚本执行该存储过程并将增量数据导出 ...

  4. 利用shell脚本[带注释的]部署单节点多实例es集群(docker版)

    文章目录 目录结构 install_docker_es.sh elasticsearch.yml.template 没事写写shell[我自己都不信,如果不是因为工作需要,我才不要写shell],努力 ...

  5. 利用shell脚本去备份幸运28源码搭建下载所指定的数据库

    #! /bin/bash幸运28源码搭建下载Q[115288oo99]logintool=/home/yx/server/mysql/mysql/bin/mysqldumptool=/home/yx/ ...

  6. 利用shell脚本个性化运行jar任务

    利用shell脚本可以个性化运行jar任务,废话不多说,直接上代码: #!/bin/bash APP_PATH=/root/bigdata/jars/data_migration_from_sqlse ...

  7. shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中

    shell编程系列24--shell操作数据库实战之利用shell脚本将文本数据导入到mysql中 利用shell脚本将文本数据导入到mysql中 需求1:处理文本中的数据,将文本中的数据插入到mys ...

  8. shell脚本实现自动压缩一天前的日志文件 ,并传到ftp服务器上

    shell脚本实现自动压缩一天前的日志文件 ,并传到ftp服务器上 naonao_127关注2人评论19401人阅读2012-06-08 11:26:16         生产环境下脚本自动备份脚本是 ...

  9. Shell 对整个文件夹中的文件进行MD5校验 [转]

    查看本地文件的 MD5 命令:md5sum FileName查看home目录下所有文件的 MD5 码:cd ~find /home -type f -print0 | xargs -0 md5sum ...

随机推荐

  1. ps -ef|grep ?解释

    上述内容为: 命令拆解: ps:将某个进程显示出来-A 显示所有程序. -e 此参数的效果和指定"A"参数相同.-f 显示UID,PPIP,C与STIME栏位. grep命令是查找 ...

  2. python 提取linux的硬件信息

    1.代码实现目的 注:代码可以直接粘贴使用 为了实现对主机的整体有明确的了解,实现了下面的代码功能 代码主要功能是: 提取到主机的内存.硬盘.CPU.型号等信息 插入到mysql的数据库中 2.代码具 ...

  3. JavaScript 日期与时间戳互转

    1.时间戳转日期格式: function timestampToTime(timestamp) { var date = new Date(timestamp * 1000);//时间戳为10位需*1 ...

  4. 喜闻乐见-Android应用的生命周期

    本文主要讲述了App的启动流程.Application的生命周期以及进程的回收机制. 在绝大多数情况下,每一个Android应用都在自己的Linux进程中运行.当需要运行某些代码时,进程就会被创建.进 ...

  5. Android系统启动流程 总结

    整体流程大致如下:   Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程.从系统角度看,Android的启动程序可分为:   1.bootload ...

  6. Android--获取高清的app图标

    只有一个方法. public synchronized static Drawable getIconFromPackageName(String packageName, Context conte ...

  7. (网页)AngularJS 参考手册

    指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ng-bind-html 绑定 HTML 元素的 innerHTML 到应用程序数据,并移除 HT ...

  8. 简述 Spring Cloud 是什么1

    很多同学都了解了Spring ,了解了 Spring Boot, 但对于 Spring Cloud 是什么还是比较懵逼的. 本文带你简单的了解下,什么是Spring Cloud. Spring Clo ...

  9. 线程:生命周期、实现方式、start()和run()的区别!

    1.线程的生命周期 要想实现多线程,必须在主线程中创建新的线程对象.Java语言使用Thread类及其子类的对象来表示线程,在它的 一个完整的生命周期中通常要经历如下的五种状态: 新建:当一个Thre ...

  10. win10 文件扩展名的更改

    win10 文件扩展名的改 随便打开一个文件夹,最好是"此电脑",  第二行是 "     文件  -   计算机  -  查看   " 在查看里面就可以更改了 ...