3

私は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[@]}5になるはずのときに1のカウントを表示します(現在、サンドボックス環境)。問題B:$name個々のファイル名の代わりにファイルの総数を表示します。

明らかに、これはすべて間違っています。何かが切り替わったことは確かですが、それが何であるかはわかりません。ヘルプ!

4

2 に答える 2

3

wc -l結果を処理するのでfind、ファイルの数がわかります。したがって、P_Arrayには1つの数値しか含まれていません。だからPlen1だけです。

それらを次のように変更します。

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-ismで簡略化して示します。

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 に答える