前言
这篇主要涉及的是目录和文件,包括获取信息,创建,修改。实例是目录文件的备份。
是否存在
判断文件或者目录是否存在:
- 文件夹不存在则创建:
if [ ! -d "/data/" ];then
mkdir /data
else
echo "文件夹已经存在"
fi
- 文件存在则删除
if [ ! -f "/data/filename" ];then
echo "文件不存在"
else
rm -f /data/filename
fi
- 判断文件夹是否存在
if [ -d "/data/" ];then
echo "文件夹存在"
else
echo "文件夹不存在"
fi
- 判断文件是否存在
if [ -f "/data/filename" ];then
echo "文件存在"
else
echo "文件不存在"
fi
- 文件比较符
-e 判断对象是否存在
-d 判断对象是否存在,并且为目录
-f 判断对象是否存在,并且为常规文件
-L 判断对象是否存在,并且为符号链接
-h 判断对象是否存在,并且为软链接
-s 判断对象是否存在,并且长度不为0
-r 判断对象是否存在,并且可读
-w 判断对象是否存在,并且可写
-x 判断对象是否存在,并且可执行
-O 判断对象是否存在,并且属于当前用户
-G 判断对象是否存在,并且属于当前用户组
-nt 判断file1是否比file2新 [ “/data/file1” -nt “/data/file2” ]
-ot 判断file1是否比file2旧 [ “/data/file1” -ot “/data/file2” ]
获取名称
获取文件名
假设给定的路径名为:
/home/project/log/202000405.log
- awk解法
用“/”做分隔符,然后打印出最后的那一部分。实现代码如下:
resFile=`echo/home/project/log/202000405.log | awk -F "/" '{print $NF}'`
- Bash Shell本身提供了basename命令,可以直接获取路径名最后的文件名,实现代码如下:
resFile=`basename /home/project/log/202000405.log`
获取目录
- awk解法
可以灵活的使用分隔符,混合正则表达式:
dirPath=`echo /home/project/log/202000405.log | awk -F '/[^/]*$' '{print $1}'`
- 官方解法(dirname)
Bash Shell本身提供了dirname命令,特别方便,可以直接获取路径对应的目录名,实现代码如下:
dirPath=`dirname /tmp/csdn/zhengyi/test/adb.log`
实例
备份指定目录下的所有*.log 文件 ,到该目录backup 目录下,加上当天的时间后缀
#!/bin/sh
#backup logs *.log
#author wuyingzhen
#date 20200405
PROJECT_PATH='/home/dev/services/game/'
LOG_DIR='logs'
LOG_PATH=$PROJECT_PATH$LOG_DIR
BACK_DIR='backup'
BACKUP_PATH=$LOG_PATH'/'$BACK_DIR
DATE_SUFFIX=`date +'%Y%m%d%H%M'`
LOG=$LOG_PATH'/backup.log'
# 查找日志文件目录,不存在就退出
if [ ! -d $LOG_PATH ]
then
echo "$LOG_PATH not exist,backup log fail!!" >> $LOG
exit 1
fi
# 查找备份目录,不存在就创建
if [ ! -d $BACKUP_PATH ]
then
echo "$BACKUP_PATH not exist,creat it" >> $LOG
mkdir $BACKUP_PATH
fi
echo "start backup $LOG_PATH/*.log to $BACKUP_PATH" >> $LOG
# 备份目录下*.log 文件,然后清空原日志文件
for LOGFILE in $(ls "$LOG_PATH"/*.log)
do
FILENAME=`basename $LOGFILE`
LOGFILE_BACKUP=$BACKUP_PATH'/'$FILENAME$DATE_SUFFIX
cp $LOGFILE $LOGFILE_BACKUP
echo "back $LOGFILE_BACKUP success!" >> $LOG
echo "clear $LOGFILE" >> $LOG
> $LOGFILE
done