从小Shell做起系列(一):做个文件自动分类吧

Auto classification Example

Created Thursday 03 April 2014

So,we can we up.


      刚刚接触Shell,突然想到自己的Download目录是默认下载目录,每次不同类型文件放在一个文件夹下看起来很乱,ls 一下眼睛都晕了,突发奇想试一试做个格式分类的,例如zip格式放同一个目录下,xx格式放xx目录下,手动mv太麻烦了类似人的节奏。于是试一试。因为系统刚换文件不多,部分文件为touch出来...由于Shell水平太菜了见笑了。

Shell Version Code



#/bin/bash

LUJING=$1  #代表要整理的目录

echo $# # $#表示参数个数,和下面函数无关,纯属看看而已
#定义移动文件的函数。
function move_file()
{
	#3个参数,第一个参数是路径,第二个参数的文件类型,第三个是想起的目录名称
	file_name=$1
	file_type=$2
	dir_name=$3
	#下面用grep 判断类型后缀在不在文件名中,例如 .txt 在不再myname.txt这个名称中
	echo $file_name | grep -q $file_type
		if [ $? -eq 0 ];then
		#如果grep找到了,就有个EXITVALUE=0,说明找到了,没有就等于1
		#$? 表示上一个命令的结束的EXITVALUE值,成功为0,失败为1
			if [ ! -d $LUJING/$dir_name ];then  #判断是否已经存在目录,不存在就建
				mkdir -p $LUJING/$dir_name
			fi
			#移动文件到文件夹,OK了
			mv -fv $LUJING/$i $LUJING/$dir_name/
		fi

}

for i in  `ls  $LUJING`
{
	#判断是不是文件
	if [ -f $LUJING/$i ];then
		#还不会截取后面的,只能有grep方法查找了。定义成函数了直接调用就好
		move_file $i ".pdf" "PDF"
		move_file $i ".exe" "EXE"
		move_file $i ".epub" "EPUB"
		move_file $i ".zip" "ZIP"
		move_file $i ".tar.gz" "TAR_GZ"
		move_file $i ".iso" "ISO"
		move_file $i ".7z" "_7z"
		move_file $i ".jpg" "Pic"
		move_file $i ".rpm" "RPM"
		move_file $i ".txt" "TXT"
		move_file $i ".html" "HTML"
		#其他的放入未分类
		move_file $i "." "NotClassFile"		
	fi
	
}

effect:


		[yg@localhost Downloads]$ ls
		4df3c207e5ba15f649b7ee55de422d5c.jpg     README
		590896715b45fe09c8b801132a9b367a.jpg     readme.txt
		dadffe.tar.gz                            test.txt
		goagent-goagent-v3.1.6-70-gc761281.zip   xx.pdf
		Linux Shell Scripting Tutorial v2.0.pdf  zimlib-devel-1.0-6.fc20.x86_64.rpm
		ok.txt
		[yg@localhost Downloads]$ ~/Shell/example/auto_extract.sh .
		[yg@localhost Downloads]$ ls
		Linux Shell Scripting Tutorial v2.0.pdf  NotClassFile  PDF  Pic  RPM  TAR_GZ  TXT  ZIP
		[yg@localhost Downloads]$ tree -L 2 .
		.
		├── NotClassFile
		│   └── README
		├── PDF
		│   ├── linux_shell_scripting.pdf
		│   └── xx.pdf
		├── Pic
		│   ├── 4df3c207e5ba15f649b7ee55de422d5c.jpg
		│   └── 590896715b45fe09c8b801132a9b367a.jpg
		├── RPM
		│   └── zimlib-devel-1.0-6.fc20.x86_64.rpm
		├── TAR_GZ
		│   └── dadffe.tar.gz
		├── TXT
		│   ├── ok.txt
		│   ├── readme.txt
		│   └── test.txt
		└── ZIP
		    └── goagent-goagent-v3.1.6-70-gc761281.zip

Python Version Code

#/bin/python
#-*-coding:utf-8-*-
import os
import shutil #高级文件操作的模块,要用到他的copy方法
from sys import argv

#参数2是dir路径
script,dir_path = argv
#先把dir_path拆分了,拆分了有'',''这种怎么办?要去掉,如["","home","yg",""] 
dir_path_list = dir_path.split("/")
dir_path_list.pop() #把最后一个''元素删除
#得到file的list 
dir_list = os.listdir(dir_path)

def remove_file(file_path,file_type):
    #字典包含了类型对应应该其的文件名
    type_dict ={".txt":"TXT",".gz":"TAR_GZ",".zip":"ZIP",".rpm":"RPM",".pdf":"PDF",".jpg":"Pic"}
    #判断在不再字典里,在就取那个名字,不再就拉到用Unknow
    dir_list = dir_path_list[:] #依然把路径复制过来
    if type_dict.has_key(file_type):
	dir_list.append(type_dict[file_type])
	want_dir = "/".join(dir_list)
    else:
        dir_list.append("Unknow")
	want_dir = "/".join(dir_list)		 
    #没有目录经创建吧
    if not os.path.exists(want_dir):
	os.mkdir(want_dir)
        print "no have path %s and creat now...,ok:" % (want_dir)
    #开始复制过去
    shutil.copy(file_path,want_dir)
    os.remove(file_path)
    print "%s --> %s " % (file_path,want_dir)
    

#判断dir_List中是目录还是文件
for i in dir_list: 
    #p_list = dir_path_list  #会不停的叠加,相当与两个指向一内存地址的指针,不能这样用
    p_list = dir_path_list[:] #通过切片复制一个list
    p_list.append(i)
    file_all_path = "/".join(p_list) #得到了文件或者目录的完整路径了,
    #接下来开始判断目录还是文件
    if os.path.isdir(file_all_path):
	pass
    elif os.path.isfile(file_all_path):
        #判断文件类型 ,用os.path.splitext方法,ext_type例如是.txt .gz .bin
        dir_root,ext_type = os.path.splitext(file_all_path)
	#已经可以判断最后一个类型了.txt了,下面就开始复制
	remove_file(file_all_path,ext_type)


effect:


从小Shell做起系列(一):做个文件自动分类吧_第1张图片

从小Shell做起系列(一):做个文件自动分类吧_第2张图片



作者:YangGan
出处:http://blog.csdn.net/incyanggan
本文基于署名 2.5 中国大陆许可协议发布,欢迎转载,演绎或用于商业目的,但是必须保留本文的署名Yanggan(包含链接).

你可能感兴趣的:(linux,shell,菜鸟,文本处理)