在 mac
或者 linux
系统中,我们的浏览器或者其他下载软件下载的文件全部都下载再 ~/Downloads/
文件夹下面。日积月累,我们的文件会越来越多。手工整理这些文件是比较繁琐的工作,于是,我就思考,我能不能用 shell
来自动整理这些下载的文件。
说干就干。
为了避免破坏我本地的文件,我自己搞了一个虚拟机跑了一个 centos
然后写下了如下的脚本。
#!/bin/bash
# Name cleardown
# Description move you files in ~/Downloads to ~/Documents/OfficeFiles
# Author FungLeo
# WebSite http://blog.csdn.net/fungleo
# find . -maxdepth 1 -type f
# Excel Other PDF Photo PPT Word Xmind Zip
# 设定要整理的文件夹为下载目录
downFinder=~/Downloads/
# 看看下载目录根目录下有哪些文件
dfiles=$(ls -l $downFinder | grep ^- | sed 's/[ ][ ]*/,/g' | awk -F "," '{print $NF}')
# 准备将这些文件处理到哪里去
filesFinder=~/Documents/OfficeFiles/
# 分辨文件类型,并给出放到哪里去的建议。这里大家可以根据自己的需求完善 case 语句
function fileType() {
case $1 in
'jpg' | 'png' | 'gif' | 'jpeg' | 'bmp')
echo 'Photo'
;;
'doc' | 'docx')
echo 'Word'
;;
'xls' | 'xlsx')
echo 'Excel'
;;
'ppt' | 'pptx')
echo 'PPT'
;;
'zip' | '7z' | 'rar')
echo 'Zip'
;;
'xmind')
echo 'Xmind'
;;
'pdf')
echo 'PDF'
;;
*)
echo 'Other'
;;
esac
}
# 判断目标文件夹中是否包含这个文件
function hasfile() {
if [ -f $1 ]; then
echo 'has'
else
echo 'nohas'
fi
}
# 给文件重新命个名字,我这里是在后面加了一个 1
function changeFileName() {
local filename=$(basename $1)
echo ${filename%.*}1.${filename##*.}
}
# 开始搬文件的函数
function mvFile() {
# 这个函数需要传两个参数,一个是原文件名,一个是新文件名。
local name=$1
local newname=$2
# 获取文件的后缀名,并且转化为小写
local type=$(echo $1 | awk -F "." '{print $NF}' | tr "[:upper:]" "[:lower:]" )
local classify=$(fileType $type)
local file=$filesFinder$classify'/'$newname
# 判断新文件名在目标地址是否有同名文件
local hasf=$(echo $(hasfile $file))
if [ $hasf = 'has' ]; then
mvFile $name $(changeFileName $newname)
else
mv $downFinder$name $file
fi
}
# 循环这些文件,并且进行处理
for i in $dfiles; do
mvFile $i $i
done
其中还是使用到了很多的知识点的。
case
语句。一开始用 if
判断,越写越丑。查了下 case
语句,果然清爽很多了。awk
方法。awk -F "." '{print $NF}'
用.
分割取最后一个。${filename##*.}
取后缀名。${filename%.*}
取文件名function
也是可以的。js
也没太大区别嘛。tr "[:upper:]" "[:lower:]"
#!/bin/bash
# Name cleardown
# Description move you files in ~/Downloads to ~/Documents/Office Files
# Author FungLeo
# WebSite http://blog.csdn.net/fungleo
# find . -maxdepth 1 -type f
# Excel Other PDF Photo PPT Word Xmind Zip
# 设定要整理的文件夹为下载目录
downFinder="${HOME}/Downloads/"
# 准备将这些文件处理到哪里去
filesFinder="${HOME}/Documents/Office Files/"
# 分辨文件类型,并给出放到哪里去的建议。这里大家可以根据自己的需求完善 case 语句
function fileType() {
case $1 in
'jpg' | 'png' | 'gif' | 'jpeg' | 'bmp')
echo 'Photo'
;;
'doc' | 'docx')
echo 'Word'
;;
'xls' | 'xlsx')
echo 'Excel'
;;
'ppt' | 'pptx')
echo 'PPT'
;;
'zip' | '7z' | 'rar')
echo 'Zip'
;;
'xmind')
echo 'Xmind'
;;
'pdf')
echo 'PDF'
;;
*)
echo 'Other'
;;
esac
}
# 判断目标文件夹中是否包含这个文件
function hasfile() {
if [ -f $1 ]; then
echo 'has'
else
echo 'nohas'
fi
}
# 给文件重新命个名字,我这里是在后面加了一个 1
function changeFileName() {
local filename=$(basename $1)
echo ${filename%.*}1.${filename##*.}
}
# 开始搬文件的函数
function mvFile() {
# 这个函数需要传两个参数,一个是原文件名,一个是新文件名。
local name=$1
local newname=$2
# 获取文件的后缀名,并且转化为小写
local type=$(echo $1 | awk -F "." '{print $NF}' | tr "[:upper:]" "[:lower:]" )
local classify=$(fileType $type)
local file="$filesFinder$classify/$newname"
# 判断新文件名在目标地址是否有同名文件
local hasf=$(echo $(hasfile $file))
if [ $hasf = 'has' ]; then
mvFile $name $(changeFileName $newname)
else
mv "$downFinder$name" "$file"
fi
}
# 设置分隔符为换行
OLD_IFS=$IFS
IFS=$'\n'
# 循环这些文件,并且进行处理
for i in $(find "$downFinder" -maxdepth 1 -type f -not -name ".*" | awk -F "/" '{print $NF}'); do
mvFile $i $i
done
# 将分隔符设置为默认,以免影响后面的程序
IFS=$OLD_IFS
"
引起来的时候,不会解析 ~
所以要用 ${HOME}
代替IFS
表示。echo
最终命令,和实际执行的结果不一定是一致的。find . -not -name ".*"
表示不找隐藏文件以上脚本均在 centos 和 MAC 下测试通过,在其他 linux 下可能会有稍许不同。