3

我正在尝试 a) 计算我的 Mass Filer 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[@]}当它应该是 5 时显示计数 1(沙箱环境,现在)。问题 B:$name显示文件总数而不是单个文件名。

显然,这一切都是错误的。我确定我有一些东西被调换了,但我不确定它是什么。帮助!

4

2 回答 2

3

由于您wc -l对结果进行了操作,因此find它将给出文件的数量。因此,P_Array 只包含一个数字。所以Plen只有1。

将它们更改为:

P_Array=$(cd ${OUT} ; find . -name "*TXT")
Plen=$(cd ${OUT} ; find . -name "*TXT" | wc -l)
于 2012-09-04T19:28:32.390 回答
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
于 2012-09-04T20:18:35.043 回答