1

我们的一个供应商有一个错误的车间系统(长话短说)。虽然他们最终修复了任何错误,但我需要隔离他们发送的文件:它们不是空的,而是有一个很长的空字符串。通常一个好的文件在 vi 中看起来像这样

    <insert_list><test_event_insert  endTime="2012-09-10T05:28:45" startTime="2012-09-10T05:27:41" operator="8176967"><process_step name="FVT" revision="NO DATA"></process_step><location1 name="CT" type="REGION"><location2 name="ONTREP1" type="TESTER"><location3 name="LineA" type="LINE"></location3></location2></location1><unit ...
"CT~DCA~FVT~8176967~ONTREP1~4~P~1100~DECA1MR0-01~XED1B1033A4675~20120910~052846.XML" [noeol][dos] 3L, 2170C

一个坏的文件会是这样的:

^@^@^@^@^@^@^@^@^@^@^@^@^@...

"CT~DCA~FVT~8176967~ONTREP1~2~P~1100~DECA1MR0-01~XED1B1045B6072~20120904~043209.XML" [noeol] 1L, 2170C

插入符号/at 符号组合是 VI 对该字符串的解释,我猜,但它实际上是一个空字符串。使用-z似乎适用于一个文件

X=CT~DCA~FVT~8176967~ONTREP1~2~P~1100~DECA1MR0-01~XED1B1045B6072~20120904~043209.XML
if [ ! -z $X ] 
then 
echo "$X empty"
else 
echo "$X not empty"
fi
    CT~DCA~FVT~8176967~ONTREP1~2~P~1100~DECA1MR0-01~XED1B1045B6072~20120904~043209.XML empty

但同样的代码告诉我,我的 EMC 批量文件管理器上的所有 900 个文件都是空的。这不是真的。

export OUT=/path/to/device
declare -a myArray
for f in "$OUT"/*ONTREP1*; do myArray+=( "${f#$OUT/}" ); done
for i in "${myArray[@]}"; do  if [ ! -z $i ] ; then echo "$i empty"; else echo "$i not empty"; fi; done

注意:模式“ ONTREP1 ”是将故障文件缩小到一个车间计算机名称。

我错过了什么?

4

1 回答 1

2

您缺少test -z string测试字符串是否为空的测试(而不是test -s file测试文件是否为空的测试。)此外,vim 中的 ^@ 指示 NUL 字节 - 值为 0 的字节。看起来这些是二进制数据文件或可能已损坏,但肯定不是空的。vim 中的空文件在最左边的列中显示为所有波浪号 (~) :-)

尝试file filename对好文件和坏文件运行命令;由于 NUL 字节,后者可能会说“数据”。

于 2012-09-11T16:57:10.387 回答