【发布时间】:2021-07-12 11:46:16
【问题描述】:
我正在尝试计算我执行脚本的目录中每个 .xls 的文件和行数。
total_files=0
total_lines=0
find . -type f -name "*.xls" | while read FILE; do
count=$(grep -c ^ < "$FILE") #get number of lines in particular file
total_lines=$(($total_lines+$count));
((total_files++))
done
echo "Total files: $total_files"
echo "Total lines: $total_lines"
但我每次只得到0。
我知道这可能是因为 while 循环是在子 shell 中执行的,
但使用<<< 在当前shell 中执行不会有帮助:
done <<< "$(find . -type f -name "*.xls")"
【问题讨论】:
-
*.xls,这是一个 Excel 文件吗? Excel 文件中的行数是什么意思? -
在您的一个文件上运行
file foo.xls。如果输出没有告诉您它是一个文本文件,那么不要费心尝试在其上运行文本处理工具。同样,查看head foo.xls的输出并确定它对您来说是否像纯文本。 -
Excel 文件不是 POSIX 文本文件,因此您无法运行像 grep 这样的在其上运行的文本文件并期望获得有意义的输出的工具。您需要找到能够理解 Excel 文件的内容来告诉您它包含多少行,或者将所有 Excel 文件导出为 CSV,然后在这些文件上运行 Unix 工具。有关可能的工具/方法,请参阅 stackoverflow.com/q/38805123/1745001 和/或 unix.stackexchange.com/q/23726/133219。
-
是的,它的输出并不可靠,如果你在任何时候都能得到正确的输出,那真是令人震惊。我刚刚创建了一个 3 行的 XLS,
grep -c ^ < "$D/tst.xls"告诉我它包含 11,874 行。 -
@EdMorton 哇,谢谢,这真的很有帮助