Without the complications of parallel, xargs, or passing pathnames back and forth:
shopt -s nullglob dotglob
for dir in /; do
set -- "$dir"/
printf '%s:\t%s\n' "${dir%/}" "$#"
done
That is, iterate over all directories and count the number of names that the * glob expands to in each.
The above is for bash, and we set the nullglob shell option to ensure that non-matching patterns are removed instead of retained unexpanded. I'm also setting the dotglob shell option to be able to match hidden names.
The zsh shell can do it while at the same time filtering the glob matches for only directories (for the loop) and only, e.g., regular files (for the loop body). In the code below, the glob qualifier (ND/) makes the preceding * only match directories, with the same effect as with nullglob and dotglob set in the bash shell, and (ND.) makes the preceding * only match regular files in the same way.
for dir in *(ND/); do
set -- $dir/*(ND.)
printf '%s:\t%s\n' $dir $#
done
Would you want to do this recursively, to get the count of names in each directory in a hierarchy, then you could just plug in the above in find:
find . -type d -exec bash -O nullglob -O dotglob -c '
for dir do
set -- "$dir"/*
printf "%s:\t%s\n" "$dir" "$#"
done' bash {} +
(the above is a bit different from the plain bash loop at the start of this answer as this would never count names in directories accessed via symbolic links), or,
find . -type d -exec zsh -c '
for dir do
set -- $dir/*(ND.)
printf "%s:\t%s\n" $dir $#
done' zsh {} +
lsand using another tool. – Nasir Riley Nov 21 '21 at 14:22