警告:以下三个代码示例中有两个使用了 bashism。如果您需要 POSIX sh 而不是 bash,请注意使用正确的。
不要做任何这些事情。如果您的真正问题确实涉及使用 find,您可以像这样使用它:
shopt -s nullglob
while IFS='' read -r -d '' dir; do
files=( "$dir"/* )
printf '%s\t%s\n' "${#files[@]}" "$dir"
done < <(find . -mindepth 1 -maxdepth 1 -type d -print0)
但是,对于仅迭代直接子目录,您根本不需要 find :
shopt -s nullglob
for dir in */; do
files=( "$dir"/* )
printf '%s\t%s\n' "${#files[@]}" "$dir"
done
如果您尝试以与 POSIX sh 兼容的方式执行此操作,则可以尝试以下操作:
for dir in */; do
[ "$dir" = "*/" ] && continue
set -- "$dir"/*
[ "$#" -eq 1 ] && [ "$1" = "$dir/*" ] && continue
printf '%s\t%s\n' "$#" "$dir"
done
你不应该ls
在脚本中使用:http: //mywiki.wooledge.org/ParsingLs
你不应该用for
阅读线: http: //mywiki.wooledge.org/DontReadLinesWithFor
在计算文件时使用数组和 glob 可以安全、稳健且无需外部命令: http: //mywiki.wooledge.org/BashFAQ/004
总是以 NUL 结尾的文件列表来自find
- 否则,包含换行符的文件名(是的,它们在 UNIX 中是合法的!)可能导致单个名称被读取为多个文件,或者(在某些查找版本和用法中)您的“文件名”与实际文件名不匹配。http://mywiki.wooledge.org/UsingFind