为什么这个脚本在读命令之后需要-rN1(特别是N1)?为什么我们只想传递1个字符?
counter=0
while IFS= read -rN1 _; do
((counter++))
done < <(find /etc -printf ' ')
echo "$counter files"
答案 0 :(得分:2)
-N1
。没有使用分隔符。输入help read
读取将在此处帮助。
整个脚本以递归方式计算文件夹中的文件,并为找到的每个文件打印一个空格。 read
读取每个空格并递增计数器。
使用wc -c
:
counter=$(find /etc -printf ' ' | wc -c)
echo "$counter files"
......甚至没有wc
:
counter=$(find /etc -printf ' ')
echo "${#counter} files"
感谢@gniourf_gniourf
答案 1 :(得分:1)
来自help read
:
-N nchars return only after reading exactly NCHARS characters, unless EOF is encountered or read times out, ignoring any delimiter
因此,这会在读取一个字符后告诉read返回。
每次读取一个字符时,counter
都会递增。因此,这有效地计算了子树/etc
中的文件数。
在此设计中(这是一个糟糕的设计,请参阅@hek2mgl的答案以获得更好的策略),find
为找到的每个文件吐出一个空格。找到每个文件只有一个空格(没有换行符等)。因此,您希望read
一次只读取一个字符,以便counter
每次都可以递增。