如何查明文件夹中是否有文件并相应退出(在 KSH 中)

如何查明文件夹中是否有文件并相应退出(在 KSH 中)

我有一个 KSH(不是重击)我想通过文件计数检查抢占的脚本。如果没有文件我想打印“EMPTY”然后退出。否则继续。

问题是当我执行文件计数时,它是空的,然后它就中断了。

代码:

###################################################
# Test to see if files exist in Drop Folder
###################################################
CONTENTS=$(ls ${gp_path}ALLSTUFF*.zip)
if [[ ${#CONTENTS[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

如果不为空,则有效。

如果为空,我会收到以下错误,然后系统崩溃。我想让它只报告 EMPTY 并退出 0:

错误:

/nas/Opt/databox/folder/ALLSTUFF*.zip not found

我究竟做错了什么?

尝试#2

我也尝试过这个,但得到了相同的结果:

if [ "$(ls ${gp_path}ALLSTUFF*.zip)" ]; then
    print 'NOT EMPTY'
else
    print 'EMPTY'
    exit 0
fi

答案1

跟进 Stéphane Chazelas 对 Kusalananda 的回答的评论:

$ ksh
$ echo ${.sh.version}
Version AJM 93u+ 2012-08-01
$ ls
TABLE1.csv  TABLE2.csv

使用数组来保存文件。从匹配某些文件的 glob 表达式开始:

$ typeset -a files
$ files=( ~(N)*.csv )
$ echo "${#files[@]}"
2
$ typeset -p files
typeset -a files=(TABLE1.csv TABLE2.csv)

现在是一个不匹配的“裸”glob,以证明不匹配的 glob 被 glob 模式替换为字符串:

$ files=( *.txt )
$ echo "${#files[@]}"
1
$ typeset -p files
typeset -a files=('*.txt')

现在带有“null glob”前缀

$ files=( ~(N)*.txt )
$ echo "${#files[@]}"
0
$ typeset -p files
(empty output)
$

请参阅 ksh 手册页的文件名生成部分。


具体回答您的问题:

typeset -a contents=( ~(N)"$gp_path"/ALLSTUFF*.zip )
if [[ ${#contents[@]} -eq 0 ]]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

您应该改掉使用全大写变量名的习惯。

也可以看看:https://mywiki.wooledge.org/ParsingLs

答案2

您可以使错误消息2>/dev/nullls.

然后您可以检查是否$CONTENTS为空-z

CONTENTS=$(ls -d -- "${gp_path}ALLSTUFF"*.zip 2>/dev/null)
if [ -z "$CONTENTS" ]; then
    print 'EMPTY'
    exit 0
else
    print 'NOT EMPTY'
fi

答案3

要检测文件名模式是否扩展为任何内容,您可以使用

set -- "$gp_path"ALLSTUFF*.zip

if [ -e "$1" ]; then
    echo matched something
else
    echo did not match anything
    exit 1
fi

set命令将位置参数设置为与模式匹配的文件名,如果第一个匹配的文件名存在,则它匹配某些内容。如果该模式不匹配任何内容,则该模式将保持未展开状态。

这可以在ksh,bash和任何其他sh类似的 shell 中使用。

相关内容