ksh从一个目录中读取文件名

问题描述:

我正在编写一个Korn Shell脚本,它将取出一个zip文件并将内容解压到一个目录中。ksh从一个目录中读取文件名

该文件可能并不总是在目录中,并且其名称中具有发布日期,例如, ALLIANCEBANK_DELTA_20141004_ABE.zip

我写了一个快速脚本来检查文件是否存在替换日期*ALLIANCEBANK_DELTA_*_ABE.zip)。

如果我回显变量,它扩展名称,但if语句不扩展它。

#!/bin/ksh 

ALLIANCE_BANKFILE=/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_*_ABE.zip 
echo $ALLIANCE_BANKFILE 
if [[ -e $ALLIANCE_BANKFILE ]] 
then 
    print "$ALLIANCE_BANKFILE found" 
else 
    print "$ALLIANCE_BANKFILE not found" 
fi 

running this gives me: 

$ ./file-exists-test.ksh 
/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_20141004_ABE.zip 
/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT/ALLIANCEBANK_DELTA_*_ABE.zip not found 

通配符的扩张确实发生在变量赋值。它确实发生在回声中,因为变量没有被引用。

如果您有ksh93,您可以这样做:在 数组中存储文件名(可能有0,1或更多)。使用~(N:pattern)表单,以便如果没有与该模式匹配的文件,则该模式被空字符串替换(默认:如果没有匹配的文件,模式字符串保留)。

dir=/swift0/usrdata/messages/FA_ALLIANCE_BANKFILE_OUT 
ALLIANCE_BANKFILES=(~(N:$dir/ALLIANCEBANK_DELTA_*_ABE.zip)) # use an array 

if ((${#ALLIANCE_BANKFILES[@]} == 0)) 
then 
    print "no ALLIANCE_BANKFILES found" 
else 
    print "${#ALLIANCE_BANKFILES[@]} files found:" 
    printf "%s\n" "${ALLIANCE_BANKFILES[@]}" 
fi