我不是技术
PHP成长
ARTICLE
linux相关
ARTICLE
其他类别
ARTICLE
文章
> [shell] linux下批量创建硬链接
15:51
2021/03/12
1082
[shell] linux下批量创建硬链接
### 已经好久没写文章了,实在是一言难尽,发生了太多事了,还好这个服务器续费的时间长.虽然我知道文章并没有什么人看,不过写写总是对自己会有一定的提升吧.希望以后会越来越好吧,不求大富大贵,但求一生平安.**已经好久没写文章了,实在是一言难尽,发生了太多事了,还好这个服务器续费的时间长.虽然我知道文章并没有什么人看,不过写写总是对自己会有一定的提升吧.希望以后会越来越好吧,不求大富大贵,但求一生平安.** 最近进了一个神秘的圈子,感觉人生处处是大佬.下载了一些资源,当我在整理这些资源的时候有这么一个需求:'在不改变原来的结构的情况下进行分类整理'.这样的话最简单的也就是复制一份出来,原来的不动,新的用来归类,但是比较占空间.由于我的空间不是很充足所以只有另寻他法,后来经过一位群友提示,有个软链接和硬链接,所以就去研究了一下,发现这个硬链接非常适合我目前这个需求.于是就准备操作一番,但是这个虽然一条命令就能搞定,不过要是文件太多的话,简直就是噩梦,去网上找了一下也有相关的项目,比如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 安装完了之后就可以执行之前的脚本了,来一张执行的图.然后就可以愉快的进行分类整理了,可以移动到另外文件夹,但是群晖不要移到另外的共享文件夹.其他的我也没有测试. 