LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 880|回复: 6

问题:把一个目录下面的文件进行分类,具体见里面

[复制链接]
发表于 2007-7-19 18:07:02 | 显示全部楼层 |阅读模式
我想把一个目录下面的文件按照日期,首先建立一个日期的目录,在在日期的目录下面建立时间的目录,最后把对应的文件放到对应目录下面
比如说我一个总目录/test下面有3个文件
-rwxrwxrwx   1 shenjch mkpasswd   2650972 Jul 13 08:52 Download.rar
-rwxrwxrwx   1 shenjch mkpasswd 193308547 Jul  2 15:13 ToolsChain.rar
-rwxrwxrwx   1 shenjch mkpasswd       192 Jul 19 17:03 script.sh
-rwxrwxrwx   1 shenjch mkpasswd      8406 Jul 13 17:16 PFlash.rar
我希望得到的结果是
把3个文件分别放到
/2007-07-13/0852/Download.rar
/2007-07-13/1716/PFlash.rar
/2007-07-02/1513/ToolsChain.rar
/2007-07-19/1703/script.sh
发表于 2007-7-19 19:49:52 | 显示全部楼层
我自己写的一个,参考一下

  1. #! /bin/sh
  2. ls -l /test --time-style=long-iso > /tmp/filelist #按标准时间格式把目录下所有文件列到一个文件内
  3. LINES=$( cat /tmp/filelist | wc -l ) #统计文件行数
  4. while [ $LINES -gt 1 ] ; do   #文件第一行为统计数,所以第一行不计算在内
  5.         PADIRS=$( sed -n "$LINES"p /tmp/filelist | awk '{print $6}' ) #日期目录
  6.         SUBDIRS=$( sed -n "$LINES"p /tmp/filelist | awk '{print $7}' ) #时间目录
  7.         mkdir -pv /test/"$PADIRS"/"$SUBDIRS"
  8.         mv /test/$( sed -n "$LINES"p /tmp/filelist | awk '{print $8}' ) /test/"$PADIRS"/"$SUBDIRS"
  9.         (( LINES-- ))
  10. done
  11. rm /tmp/filelist
复制代码

刚才没看清,你的时间格式是不要冒号的,可以这把时间目录重新设一下

  1. SUBDIRS=$( sed -n "$LINES"p /tmp/filelist | awk '{print $7}' | cut -c1-2,4-5 ) #时间目录
复制代码
回复 支持 反对

使用道具 举报

发表于 2007-7-19 21:49:05 | 显示全部楼层
给一些建议吧:

[color="Magenta"]ls -l --time-style="+%Y-%m-%d/%H%M" | (while read null null null null null ftime fname ; do [ -f "$fname" ] && ( mkdir -p $ftime 2>/dev/null ; mv -v "$fname" "$ftime/" ) ; done)
将把当前目录下的文件,按照要求转移到特定的目录下

解释:
  1. ls -l --time-style="+%Y-%m-%d/%H%M"
复制代码
返回的时间格式是 1970-01-01/0000 这样的格式(年-月-日/时分)
  1. (while read ..... )
复制代码
是把ls输出的结果按照行的方式读取,并操作
  1. read null null null null null ftime fname
复制代码
将把文件的时间读取到ftime中,文件名读取到fname中,其他的信息因为不需要,因此用null代替
  1. [ -f "$fname" ]
复制代码
表示只对文件进行( )中的操作
  1. mkdir -p $ftime 2>/dev/null
复制代码
创建目录,格式是1970-01-01/0000  2>/dev/null 是表示将错误输出掩盖,因为有可能出现年月日和时分相同的文件
  1. mv -v "$fname" "$ftime/"
复制代码
  表示将文件转移到指定的目录下,-v的选项是输出实际的移动文件的信息

[color="Red"]执行环境:
[color="Blue"]debian testing
GNU bash, version 3.1.17(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
回复 支持 反对

使用道具 举报

发表于 2007-7-20 06:49:01 | 显示全部楼层
学习,很多命令的用法都不知道,问题被你一说,简单多了
回复 支持 反对

使用道具 举报

发表于 2007-7-31 15:02:37 | 显示全部楼层
这也能做到,shell果然很强啊。汗自己一个
回复 支持 反对

使用道具 举报

发表于 2007-8-1 22:32:21 | 显示全部楼层
[quote=springwind426]给一些建议吧:

ls -l --time-style="+%Y-%m-%d/%H%M" | (while read null null null null null ftime fname ; do [ -f "$fname" ] && ( mkdir -p $ftime 2>/dev/null ; mv -v "$fname" "$ftime/" ) ; done)


强的,把这么复杂的事情一步一步做的那么细  看你的shell还真学到不少东西
回复 支持 反对

使用道具 举报

发表于 2007-8-2 15:14:00 | 显示全部楼层

  1. #!/bin/bash

  2. if [ $# -lt 2 ];then
  3.   echo "Usage: $0 source_dir target_dir"
  4.   echo "number of args:$#"
  5.   exit 1
  6. fi

  7. for file in `ls $1`;
  8. do
  9.   DATE=$(stat $1/$file |grep -i modify |awk '{print $2}')
  10.   TIME=$(stat $1/$file |grep -i modify |awk '{print $3}'|awk -F: '{print $1$2}')
  11.   if [ -d "$2/$DATE/$TIME" ]; then
  12.     cp -a $1/$file $2/$DATE/$TIME/
  13.   else
  14.     mkdir -p $2/$DATE/$TIME
  15.     cp -a $1/$file $2/$DATE/$TIME/
  16.   fi
  17. done

  18. exit 0
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表