今日小练题目📢
有一个目录/data/att/,该目录下有数百个子目录, 比如/data/att/aming, /data/att/linux 然后再深入一层为以日期命名的目录,例如 /data/att/aming/20231009, 每天会生成一个日期新目录,由于/data所在磁盘快满了, 所以需要将老文件(一年以前的)挪到另外一个目录/data1/att下, 示例:mv /data/att/aming/20211001 /data1/att/aming/20211001 挪完之后,还需要做软链接, 示例:ln -s /data1/att/aming/20211001 /data/att/aming/20211001 写一个脚本,要求/data/att/下所有子目录都要按此操作, 脚本会每天01:00 执行一次,任务计划无需考虑,只需要写脚本即可 提醒:要确保老文件成功挪到/data1/att下之后才能做软链接,需要有日志
优秀作业🤌🏻
#!/bin/sh
#author:xYLiuuuuuu
#version:v1
#date:2024-11-17
main()
{
cd /data/att
for dir in `ls`
do
for dir2 in `find $dir -maxdepth 1 type d -mtime +365`
do
rsync -aR $dir2/ /data1/att/
if [ $? -eq 0 ]
then
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 &> /tmp/move_old_data_`date +%F`.log
敲黑板📝
- find命令
-maxdepth 1 # 限制查找的深度为 1,即只在当前指定的目录下查找,不深入子目录
-type type # f普通文件、d目录、l符号链接
-mtime days:按修改时间查找,支持使用 `+` 或 `-` 表示在指定天数前或后,days 是一个整数表示天数。
-name pattern`:按文件名查找,支持使用通配符 `*` 和 `?`。
-size [+-]size[cwbkMG]:按文件大小查找,支持使用 `+` 或 `-` 表示大于或小于指定大小,单位可以是 `c`(字节)、`w`(字数)、`b`(块数)、`k`(KB)、`M`(MB)或 `G`(GB)。
# 在当前目录下查找最近 20 天内状态发生改变的文件和目录
$ find . -ctime 20
- rsync命令,用于同步文件,可代替cp+mv命令
# `-r`表示递归,即包含子目录。
$ rsync -r source1 destination
$ rsync -r source1 source2 destination
# `-a`参数可以替代`-r`,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)
$ rsync -a source/ destination
# `-n`参数模拟命令执行的结果,并不真的执行命令。`-v`参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。
$ rsync -anv source/ destination
- 可以通过main函数的形式来方便定义脚本日志
- 脚本某行很长的话,可以\来换行,但本质还是一行内容
&>:这是一个重定向操作符。它将标准输出(stdout)和标准错误输出(stderr)都重定向到指定的文件。