bash判断文件或文件夹是否存在

# 相对/绝对路径

绝对路径:

curDir=$(
    cd "$(dirname "$0")"
    pwd
)
defaultFile=${curDir}/env/.env.default
1
2
3
4
5

相对路径:

$(pwd)
defaultFile=$(pwd)/env/.env.default
1
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
#!/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

在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

统一方法检测文件是否存在,不存在的创建;

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

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

输出: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

# 判断文件是否更新、修改

核心命令: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

如果要判断某文件自从上次修改以来是否有变更过,则可以将文件状态记录在一个文本中。下次提取比较即可。这里不提供实现。

# 实践

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
上次更新: 2022/04/15, 05:41:30
×