关于bash:检查目录是否存在并计算与其中模式匹配的文件

Check if directory exists and count files matching a pattern in it

本问题已经有最佳答案,请猛点这里访问。

我的代码有一个从源输入的目录路径,例如$D_path

现在,我需要检查目录路径是否存在,以及路径中是否存在模式(*abcd*的文件计数。

我不知道如何通过bash脚本使用如此复杂的表达式。


只有密码的答案。根据要求提供解释

1
2
3
4
5
6
if [[ -d"$D_path" ]]; then
    files=("$D_path"/*abcd* )
    num_files=${#files[@]}
else
    num_files=0
fi

我忘记了:默认情况下,如果没有与模式匹配的文件,那么files数组将包含一个带有文字字符串*abcd*的条目。要得到目录存在但没有文件匹配的结果=>num_files==0,则需要设置一个额外的shell选项:

1
shopt -s nullglob

这将导致不匹配任何文件的模式展开为空。默认情况下,匹配任何文件的模式都不会作为文本字符串扩展到该模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ cat no_such_file
cat: no_such_file: No such file or directory
$ shopt nullglob
nullglob        off

$ files=( *no_such_file* ); echo"${#files[@]}"; declare -p files
1
declare -a files='([0]="*no_such_file*")'

$ shopt -s nullglob

$ files=( *no_such_file* ); echo"${#files[@]}"; declare -p files
0
declare -a files='()'