### 已经好久没写文章了,实在是一言难尽,发生了太多事了,还好这个服务器续费的时间长.虽然我知道文章并没有什么人看,不过写写总是对自己会有一定的提升吧.希望以后会越来越好吧,不求大富大贵,但求一生平安.**已经好久没写文章了,实在是一言难尽,发生了太多事了,还好这个服务器续费的时间长.虽然我知道文章并没有什么人看,不过写写总是对自己会有一定的提升吧.希望以后会越来越好吧,不求大富大贵,但求一生平安.**
最近进了一个神秘的圈子,感觉人生处处是大佬.下载了一些资源,当我在整理这些资源的时候有这么一个需求:'在不改变原来的结构的情况下进行分类整理'.这样的话最简单的也就是复制一份出来,原来的不动,新的用来归类,但是比较占空间.由于我的空间不是很充足所以只有另寻他法,后来经过一位群友提示,有个软链接和硬链接,所以就去研究了一下,发现这个硬链接非常适合我目前这个需求.于是就准备操作一番,但是这个虽然一条命令就能搞定,不过要是文件太多的话,简直就是噩梦,去网上找了一下也有相关的项目,比如github就有一个批量创建硬链接的项目,不过他的好像是nodejs的项目,需要先安装nodejs环境,而我又想直接放上去就能用的,所以就想到了shell脚本,其实我对shell脚本的认知就是,我知道它,但是没有开发过.经过了短暂的学习,发现也不是很难,所以就直接上手了.
```shell
#!/bin/bash
workdir=$(cd $(dirname $0); pwd);
cache=cache.txt
out=fileout
echo 当前目录是[$workdir];
if [ -e $out ]; then
echo 检测到${out}目录存在;
else
echo 没有检测到${out}目录存在,创建目录;
mkdir "$out"
fi
#检测是否有缓存文件,没有就创建
if [ -e $workdir"/"$cache ];
then
echo 检测到${cache}文件存在
else
echo 没检测到${cache}文件存在,创建${cache}
touch ${cache}
fi
cat $workdir"/"$cache;
get_file_list(){
IFS=$(echo -en "\n\b")
for file in $(ls $1)
do
if [ -d $1"/"$file ]
then
if [ $file != $out ]; then
if [ -e $2"/"$file ]; then
echo 检测到${2}"/"${file}目录存在;
else
echo 没有检测到${2}"/"${file}目录存在,创建目录;
mkdir "$2"/"$file"
fi
get_file_list $1"/"$file $2"/"$file
fi
else
if [ $1"/"$file != $workdir"/"$cache ]&&[ $1"/"$file != ${workdir}"/test.sh" ]; then
name_md5=$(echo -n $1"/"$file | md5sum | cut -d ' ' -f 1)
if [ `grep -c $name_md5 $workdir"/"$cache` -ne '0' ]; then
# if [ awk -v RS="@#$j" '{print gsub(/$1"/"$file/,"&")}' $workdir"/"$cache -ne '0' ]; then
echo ${file}硬链接已经存在,跳过;
else
# if [ "${file##*.}"x = "mp4"x ] || [ "${file##*.}"x = "mkv"x ]; then #指定文件后缀
ln ${1}"/"${file} ${2}"/"${file} #创建硬链接到$file目录
echo ${file}创建硬链接,并写入缓存
echo $name_md5>>${cache}
# fi
fi
fi
fi
done
};
get_file_list $workdir $workdir"/"$out
```
这个是所有的代码,也不是很多,传上去就能直接用的,整个逻辑大概就是先定义当前目录,缓存文件,输出目录的变量,检测并创建输出目录和缓存文件,遍历当前所有文件和文件夹,如果是文件夹就在输出目录创建一个相同名的文件夹,继续递归遍历.如果是文件,先在缓存文件查询该文件的记录,如果有就不做操作并跳过,如果缓存文件没有就创建硬链接到镜像文件夹下,并写入缓存文件.
其实之前我是先直接把文件名写入缓存文件的,但是后来遇到一种bug就是超级长的文件名会无法查找.所以后来改进了一下,写入文件名md5值进缓存.后来才有了md5sum这个函数.之前我开发环境是deepin,直接测试通过了,我就拿到群晖测试.结果有一个很尴尬的事情就是
`./test.sh: line 47: md5sum: not found`
提示这个.然后后来就网上找了一圈资料,安装了一点东西就能用这个函数了,先安装ipkg包管理软件,基本上都是推荐群晖安装这个,群晖自己本身是没有yum这之类的包管理软件,但是可以用weget.
wget http://ipkg.nslu2-linux.org/feeds/optware/syno-i686/cross/unstable/syno-i686-bootstrap_1.2-7_i686.xsh
chmod +x syno-i686-bootstrap_1.2-7_i686.xsh
sh syno-i686-bootstrap_1.2-7_i686.xsh
这个是用weget脚本来安装ipkg,接下来用这个ipkg安装可以让群晖用md5sum函数的东东
ipkg install coreutils
安装完了之后就可以执行之前的脚本了,来一张执行的图.然后就可以愉快的进行分类整理了,可以移动到另外文件夹,但是群晖不要移到另外的共享文件夹.其他的我也没有测试.
