1

我有一个非常简单的问题,我发现一堆类似的问题得到了回答,但没有一个能为我解决这个问题。

我有一个 shell 脚本,它通过一个目录并打印出子目录中的文件和目录的数量,然后是目录名称。

但是,如果目录带有空格,它会失败,它会尝试将每个单词用作新参数。我曾尝试将 $dir 放在引号中,但这无济于事。也许是因为它已经在回声报价中。

for dir in `find . -mindepth 1 -maxdepth 1 -type d`
do
    echo -e "`ls -1 $dir | wc -l`\t$dir"
done

在此先感谢您的帮助 :)

4

1 回答 1

4

警告:以下三个代码示例中有两个使用了 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

于 2013-05-05T14:20:16.747 回答