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

Posted 根号5减1除以2

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下相关的知识,希望对你有一定的参考价值。

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

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

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

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

  技术分享

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

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

  接下来,我再把这个日期搞成这种格式,2016/03/04    -F是分隔符,也可以写在里头在命令里写FS="-",但是必须要有BEGIN

#  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脚本也就自然出来了:

 1 #/bin/bash
 2 
 3 for file in ./* 
 4 do
 5 if [[ -f $file ]]
 6    then str=$(stat $file | awk ‘NR==6{print $2}‘ | awk -F - ‘{print $1"/"$2"/"$3}‘)
 7         if [[ ! -d $str ]]
 8            then mkdir -p $str
 9         fi  
10         mv $file $str  
11 fi
12 done

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

 

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

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

 

  

以上是关于利用shell脚本或者php移动某个文件夹下的文件到各自的日期组成的目录下的主要内容,如果未能解决你的问题,请参考以下文章

shell备份移动某个目录下的文件

shell脚本,怎样将某个目录下的所有文件的后缀改为.bak

备忘录AIX主机下用SHELL脚本编写FTP传某个目录下的文件到LINUX主机

在Ubuntu下编写shell脚本读取文件

求高手编写Shell脚本,实现调用Linux下的SQLITE,导入CSV文件的功能

利用Apache漏洞getshell(.htaccess 文件攻击上传shell)