我有一个非常简单的问题,我已经找到了一堆类似的问题回答,但没有就解决这对我来说。
我有一个shell脚本,通过目录进入,并打印出的文件和目录的子目录的数目,然后是目录名。
然而,它未能与空格的目录,它会尝试使用每个单词作为一个新的说法。 我试图把$目录中的报价,但没有帮助。 也许是因为它已经在回声报价。
for dir in `find . -mindepth 1 -maxdepth 1 -type d`
do
echo -e "`ls -1 $dir | wc -l`\t$dir"
done
在此先感谢您的帮助 :)
警告 :下面使用bash化的三个代码样本中的两个。 请小心,如果你需要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)
然而,对于迭代只顾眼前利益子目录,你并不需要找到所有:
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
计数文件时使用数组和水珠要做到这一点安全,稳健,且无需外部命令: http://mywiki.wooledge.org/BashFAQ/004
始终NUL,终止的文件列表出来的find
-否则,包含换行符(!是的,他们是在UNIX法律)文件名可能会读取到一个名称为多个文件,或(在某些版本中找到和惯例)您“文件名”不符合实际文件名。 http://mywiki.wooledge.org/UsingFind