标签搜索

shell脚本一天一练----目录文件移动

lilymaxyz
2025-04-30 / 0 评论 / 10 阅读 / 正在检测是否收录...

shell脚本一天一练----目录文件移动

#!/bin/bash
# *************************************
# * 功能: Shell脚本模板
# * 作者: 刘丹玉
# * 联系: v649352141@163.com
# * 版本: 2025-04-30
# *************************************

# 需求:
# 有一个目录/data/att/,该目录下有数百个子目录
# 比如/data/att/dange, /data/att/linux
# 然后再深入一层为以日期命名的目录,例如 /data/att/dange/20241009
# 每天会生成一个日期新目录,由于/data 所在的磁盘快满了
#
# 所以需要将老文件(一年以前的)挪到另外一个目录/data1/att下
# 示例: mv /data/att/dange/20230504 /data1/att/dange/20230504
#
# 挪完之后,还需要做软链接
# 示例: ln -s /data1/att/dange/20230504 /data/att/dange/20230504
#
# 写一个脚本,要求/data/att/下所有子目录都要按此操作
# 脚本会每天01:00 执行一次,任务计划无需考虑,只需要写脚本即可
# 提醒: 要确保老文件成功挪到/data1/att下之后才能做软链接,需要有日志

# 先定义一个main函数,目的是为了后面调用函数,方便记录日志
main(){
    cd /data/att
    # 遍历第一层目录
    for dir in $(ls)
    do
        # 遍历第二层目录,用find只找当前目录下一年以前的子目录
        for dir2 in $(find $dir -maxdepth 1 -type d -mtime +365)
        do
            # 将目标目录下的文件同步到/data1/att/目录下,注意这里的-R可以自动创建目录结构
            rsync -aR $dir2/ /data1/att/
            if [ $? -eq 0 ]
            then
                # 如果同步成功,会将/data/att下的目录删除
                rm -rf $dir2
                echo "/data/att/$dir2 移动成功"
                # 做软链接
                ln -s /data1/att/$dir2 /data/att/$dir2 && \
                echo "/data/att/$dir2 成功创建软链接"
                echo
            else
                echo "/data/att/$dir 未移动成功"
            fi
        done
    done
}

# 调用main函数,并将输出写入日志里,日志每天一个
main &> /tmp/move_old_data_$(date +%F).log


<<'COMMENT'
关键知识点总结:
1) 可以通过main函数的形式来方便定义脚本日志
2) find 使用 -maxdepth 定义查找目录层级
3) 脚本某行很长的话,可以使用"\ + 回车"来换行,但本质上还是一行内容
4) rsync的-R选项可以自动级联创建目录层级
COMMENT
[root@Rocky9-12 ~]# mkdir -p /data/att
[root@Rocky9-12 ~]# mkdir -p /data1/att
[root@Rocky9-12 ~]# cp -rp /etc/* /data/att/

endl

0

评论

博主关闭了所有页面的评论