无法在阵列中显示目录内容

时间:2012-09-04 19:19:13

标签: arrays bash

我正在尝试a)计算我的群发文件管理器EMC设备上有多少文件,b)将它们加载到数组中c)显示我拥有多少文件的数量d)批量加载数据库中的每个文件e )显示我刚刚加载的文件的名称。

这是我的代码......

export OUT=/path/to/device
P_Array=$(cd ${OUT} ; find . -name "*TXT" | wc -l)
Plen=${#P_Array[@]}
echo "$Plen FILES TO PROCESS."                                       
if [ $Plen -eq 0 ]
then
        echo "`date '+%m/%d/%y %T:'` ZERO FILES."                  
fi

for name in ${P_Array[@]}
do
        ###Database Bulk Load Here###
        echo "`date '+%m/%d/%y %T:'` $name was loaded."
done

问题A:Plen=${#P_Array[@]}显示计数为1时应为5(沙盒环境,现在)。 问题B:$name显示文件总数而不是单个文件名。

显然,这都是错的。我确信我有一些转变,但我不确定它是什么。救命啊!

2 个答案:

答案 0 :(得分:3)

由于您对wc -l的结果find,它会给出文件数量。因此,P_Array只包含一个数字。所以Plen只是1。

将它们更改为:

P_Array=$(cd ${OUT} ; find . -name "*TXT")
Plen=$(cd ${OUT} ; find . -name "*TXT" | wc -l)

答案 1 :(得分:1)

您需要将P_Array设为实际数组,而不仅仅是字符串中以空格分隔的单词列表:

P_Array=( $(cd ${OUT} ; find . -name "*TXT") )
Plen=${#P_Array[@]}

如果任何文件在文件名中有空格,则不起作用,因为这样的文件将在数组中作为一系列部分文件名结束。在这种情况下,你必须做类似

的事情
pushd "$OUT"         # Switch to the desired directory
P_array=( *TXT )
popd                 # Return to the previous directory, if you like.
Plen=${#P_Array[@]}

(实际上,这可能比首先使用find更好。)


如果你使用数组,你已经放弃了POSIX兼容性,所以这里是你的脚本的其余部分,简化了更多的bash-isms:

date_fmt='%m/%d/%y %T'
if (( Plen = 0 ))
then
    # $(...) is still POSIX, but is also preferred over backticks
    # printf is also preferred, and you can transfer the formatting
    # from date to the printf.
    printf "%($date_fmt)T: ZERO FILES\n" $(date +%s)
fi

# Quote the array expansion, in case of space-containing filenames
for name in "${P_Array[@]}"
do
    ###Database Bulk Load Here###
    # (be sure to quote $name when doing the bulk load)
    printf "%($date_fmt)T: $name was loaded\n" $(date +%s)
done