Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本
在 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:]"
2017年08月08日补充,解决文件名中包含空格的问题
#!/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 下可能会有稍许不同。
本文由 FungLeo 原创,允许转载,但转载必须保留首发链接。
Shell 命令行,写一个自动整理 ~/Downloads/ 文件夹下文件的脚本的更多相关文章
- python调用另一个文件中的代码,pycharm环境下:同文件夹下文件(.py)之间的调用,出现红线问题
如何调用另一个python文件中的代码无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等, ...
- Ubuntu 统计文件夹下文件个数的命令
查看当前目录下的文件数量(不包含子目录中的文件) ls -l|grep "^-"| wc -l 查看当前目录下的文件数量(包含子目录中的文件) 注意:R,代表子目录 ls -lR| ...
- [linux常用命令]查看当前文件夹或该文件夹下文件(夹)的大小
du -sh *(星号表示当前所有文件夹)可以查看当前目录下各个文件夹的大小,-s表示只显示当前文件夹(不加-s你可以看到所有文件夹下的子文件夹的大小,太多了),-h表示以合适的大小查看.(可以用- ...
- 【AMAD】watchdog -- 用于监控文件系统的事件,并且提供了shell命令行工具
简介 动机 作用 用法 个人评分 简介 用于监控文件系统的事件的Python库,并且提供了shell命令行工具 动机 有很多情况下,我们希望监控文件的变化,在变化之后作出一些响应. 比如flask,d ...
- HDFS shell命令行常见操作
hadoop学习及实践笔记—— HDFS shell命令行常见操作 附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop ...
- hadoop2.5.2学习及实践笔记(五)—— HDFS shell命令行常见操作
附:HDFS shell guide文档地址 http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/FileSy ...
- shell命令查看某文件夹下的文件个数
shell命令查看某文件夹下的文件个数 2010-06-25 17:05:15| 分类: shell |字号 订阅 1.查看某文件夹下文件的个数: ls -l |grep "^-&qu ...
- shell统计当前文件夹下的文件个数、目录个数
1. 统计当前文件夹下文件的个数 ls -l |grep "^-"|wc -l 2. 统计当前文件夹下目录的个数 ls -l |grep "^d"|wc -l ...
- Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件
Shell 命令行 从日志文件中根据将符合内容的日志输出到另一个文件 前面我写了一篇博文Shell 从日志文件中选择时间段内的日志输出到另一个文件,利用循环实现了我想要实现的内容. 但是用这个脚本的同 ...
随机推荐
- jQuery Form
https://github.com/jquery-form/form#type 概念 jQuery表单插件允许您轻松,无差错地升级HTML表单以使用AJAX. 主要方法ajaxForm和ajaxSu ...
- [py]django的manytomany字段和后台搜索过滤功能
我本来想搞下Django之select_related和prefetch_related的区别,看到这里有djangoapi的知识, 之前搞过django restfulapi,http://blog ...
- [py][mx]django实现根据城市和课程机构类别过滤
实现根据城市&课程机构过滤 实现点谁谁高亮,支持取交集. 直接上代码吧 本质上是过滤,多层过滤,取交集 def get(self, request): all_orgs = CourseOrg ...
- cocos代码研究(12)UI之Widget学习笔记
理论基础 Widget类,所有UI控件的基类. 这类继承自ProtectedNode和LayoutParameterProtocol. 如果你想实现自己的UI控件,你应该继承这个类. 被 VideoP ...
- 图解Kerberos认证工作原理
本文是我在看了这篇英文说明之后的总结 https://technet.microsoft.com/zh-cn/library/cc961976.aspx 是总结,不是翻译,所以是我看后按自己的理解写的 ...
- Python笔记 #06# NumPy Basis & Subsetting NumPy Arrays
原始的 Python list 虽然很好用,但是不具备能够“整体”进行数学运算的性质,并且速度也不够快(按照视频上的说法),而 Numpy.array 恰好可以弥补这些缺陷. 初步应用就是“整体数学运 ...
- bzoj1618 / P2918 [USACO08NOV]买干草Buying Hay(完全背包)
P2918 [USACO08NOV]买干草Buying Hay 显然的完全背包 设$f[i]$为买$i$磅干草的最小代价 搞搞完全背包即可 注意到最后可能买的干草超出范围,但是价格可能更低. 于是我们 ...
- NOIP2016 T4 魔法阵 暴力枚举+前缀和后缀和优化
想把最近几年的NOIP T4都先干掉,就大概差16年的,所以来做一做. 然后这题就浪费了我一整天QAQ...果然还是自己太弱了QAQ 点我看题 还是pa洛谷的... 题意:给m个物品,每个物品有一个不 ...
- 利用Html.css OPPO手机导航菜单的制作解析
<body> <div id="top" class="auto"> <div class="nav"> ...
- 51nod 1225 余数的和 数学
1225 余数之和 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 F(n) = (n % 1) + (n % 2) + (n % 3) + ... ...