bash判断文件或文件夹是否存在
# 相对/绝对路径
绝对路径:
curDir=$(
cd "$(dirname "$0")"
pwd
)
defaultFile=${curDir}/env/.env.default
1
2
3
4
5
2
3
4
5
相对路径:
$(pwd)
defaultFile=$(pwd)/env/.env.default
1
2
2
# 脚本
# 判断文件/夹/参数是否存在
- -e filename 如果 filename存在,则为真
- -d filename 如果 filename为目录,则为真
- -f filename 如果 filename为常规文件,则为真
- -L filename 如果 filename为符号链接,则为真
- -r filename 如果 filename可读,则为真
- -w filename 如果 filename可写,则为真
- -x filename 如果 filename可执行,则为真
- -s filename 如果文件长度不为0,则为真
- -h filename 如果文件是软链接,则为真
- -n 测试字符串的长度不为零
- -z 测试字符串的长度为零
- -f 用来测试文件是否存在,以及是否是一个普通的文件
- -d 用来测试文件是否存在,以及是否是一个目录
- ls -A 的命令是列出当前目录所有文件和目录,不包含 "." (目前目录) 及 ".." (父目录)
- ls -a 的命令会列出所有文件和目录,"." 开头的隐藏文件也会被列出,包含 "." (目前目录) 及 ".." (父目录)
另外一种方式判断文件是否存在或者是否为空;
用test 指令来实现,通过 man test 指令可以查看关于test指令的手册,手册中有如下说明:
- -f判断是不是文件; -d判断是不是目录;
- -s FILE:判断文件存在且文件大小大于零,则返回真; 当-s后面跟目录是,总是返回真
- -e FILE: 判断文件/目录是否存在;如果文件存在,则返回真;
#shell判断文件,目录是否存在或者具有权限
folder="/var/www/"
file="/var/www/log"
# -x 参数判断 $folder 是否存在并且是否具有可执行权限;【!前面注意这里的空格】
if [ ! -x "$folder"]; then
mkdir "$folder"
fi
#如果文件夹不存在,创建文件夹 【!前面注意这里的空格】
# -d 参数判断 $folder 是否存在;-d 用来测试文件是否存在,以及是否是一个目录
if [ ! -d "$folder"]; then
mkdir "$folder"
fi
# -f 参数判断 $file 是否存在;-f 用来测试文件是否存在,以及是否是一个普通的文件
if [ ! -f "$file" ]; then
touch "$file"
fi
# 备份目标文件夹 # 打包临时文件夹创建
YMD=$(date -d "1 day ago" +%Y%m%d)
TARGETPATH=/optms/optms/file/batch/
echo "检查(创建)打包临时文件夹:${TARGETPATH}/${YMD}"
if [ ! -d "${TARGETPATH}/${YMD}" ] ;
then
mkdir -p "${TARGETPATH}/${YMD}"
fi
##判断目录是否为空,为空则删除
BAK=$1
if [ "`ls -A ${BAK}`" = "" ];
then
echo "${BAK} is empty"
else
echo "${BAK} is not empty"
fi
echo "----------$(date +%Y年%m月%d日' '%T)测试(test.sh)----------"
# -n 判断一个变量是否有值; -n 测试字符串的长度不为零
if [ ! -n "$var" ]; then
echo "$var is empty"
exit 0
fi
# 由于没有类似js boolean类型,只能用字符串判断处理;
pull=false
if [ $pull == true ]; then
echo "1"
else
echo "2"
fi
# 判断两个变量是否相等
if [ "$var1" = "$var2" ]; then
echo '$var1 eq $var2'
else
echo '$var1 not eq $var2'
fi
# 判断是否传入参数
if [ $# -eq 0 ] # 脚本必须传入参数。
#if [ $# -gt 0 ]; then
then
echo "Please invoke this script with one or more command-line arguments."
exit $E_NO_ARGS
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#!/bin/sh
##方法一 判断输出字符数统计为0
is_empty_dir(){
return `ls -A $1|wc -w`
}
##方法二 判断输出string为空
#is_empty_dir(){
# return $[ -z `ls -A $1` ]
#}
if is_empty_dir $1
then
echo " $1 is empty"
else
echo " $1 is not empty"
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在shell中通过test指令测试文件是否为空的示例脚本
在shell中,test指令还有另外一种写法,上面的脚本和下面的脚本是等价的:
#!/bin/bash
# 方式一:test方式
# if test -s ./arg.sh; then
# 方式二:[]方式
if [ -s ./arg.sh ]; then
echo "hi"
else
echo "empty"
fi
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
统一方法检测文件是否存在,不存在的创建;
function checkFileEmpty() {
isEmptyFile=true
file=$1
if [ -e $file ]; then
if [ "$(ls -A ${file})" != "" ]; then
isEmptyFile=false
fi
else
mkdir -p $file
fi
echo $isEmptyFile
}
isEmpty=$(checkFileEmpty ./aa)
echo "=======hahaha=======$isEmpty"
# if [ $isEmpty == false ]; then
# fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if else语句经常与test命令结合使用,如下所示:
num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
echo 'The two numbers are equal!'
else
echo 'The two numbers are not equal!'
fi
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
输出:The two numbers are equal!
shell命令判断文件或文件夹是否存在
判断文件内容是否改变:判断方式
- 1)md5值判断
- 2)diff 判断
#!/bin/sh
#判断文件存在,判断是否为文件夹等
testPath="/Volumes/MacBookProHD/Mr.Wen/08 shell命令"
testFile="/Volumes/MacBookProHD/Mr.Wen/08 shell命令/fileWen"
#判断文件夹是否存在 -d
if [[ ! -d "$testPath" ]]; then
echo "文件夹不存在"
else
echo "文件夹存在"
fi
#判断文件夹是否存在,并且具有可执行权限
if [[ ! -x "$testFile" ]]; then
echo "文件不存在并且没有可执行权限"
else
echo "文件存在并有可执行权限"
fi
#判断文件是否存在
if [[ ! -f "$testFile" ]]; then
echo "文件不存在"
else
echo "文件存在"
fi
echo '=====检查参数env文件合法性====='
if [ -n "$1" ]; then
if [ ! -f $targetFile ]; then
echo "File env not exist ${targetFile}"
echo "Please enter a legal ENV configuration!!!"
exit $E_NO_FILES
fi
fi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 判断文件是否更新、修改
核心命令:stat; 如下函数,判断文件是否更新,传入文件路径,间隔时间(秒s),则输入文件在多少秒内是否被更新过。 函数会持续等待文件不再变化后停止。
function whether_changed(){
local file_path=${1}
local check_time=${2}
while [[ true ]]; do
file_old_stat="`stat ${file_path}|grep Size`"
sleep ${check_time}
file_new_stat="`stat ${file_path}|grep Size`"
if [[ `echo ${file_old_stat}` == `echo ${file_new_stat}` ]]; then
echo "### In ${check_time}s ,${file_path} does not change ###"
break;
else
echo "#### Wait ${check_time}s ####"
fi
done
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
如果要判断某文件自从上次修改以来是否有变更过,则可以将文件状态记录在一个文本中。下次提取比较即可。这里不提供实现。
# 实践
getdist.sh
#!/bin/sh
set -e
if [ -f "dist.zip" ]; then
mv dist.zip backweb/dist`date +%Y%m%d%H%M%S`.zip
fi
sleep 1
ftp -niv <<!
open 10.45.47.x
user jkuser xx
binary
cd /var/lib/jenkins/workspace/zsmart-rgdp-web
prompt
get dist.zip
close
bye
!
sleep 2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
上次更新: 2022/04/15, 05:41:30