我正在尝试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
显示文件总数而不是单个文件名。
显然,这都是错的。我确信我有一些转变,但我不确定它是什么。救命啊!
答案 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