脚本失败,目录名称中包含空格

时间:2013-05-05 14:18:31

标签: shell

我有一个非常简单的问题,我发现了一些类似的问题,但没有一个能解决这个问题。

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

但是,如果目录中包含空格,它会尝试将每个单词用作新参数。我试过把$ dir放在引号中,但这没有用。也许是因为它已经在回声引用中。

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

提前感谢您的帮助:)

1 个答案:

答案 0 :(得分:4)

警告:以下三个代码示例中有两个使用bashisms。如果你需要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

您不应该在脚本中使用lshttp://mywiki.wooledge.org/ParsingLs

您不应该使用for来读取行:http://mywiki.wooledge.org/DontReadLinesWithFor

在计算文件时使用数组和整数来安全,健壮地执行此操作,并且无需外部命令:http://mywiki.wooledge.org/BashFAQ/004

总是NUL终止来自find的文件列表 - 否则,包含换行符的文件名(是的,它们在UNIX中是合法的!)会导致单个名称被读取为多个文件,或者(在一些找到版本和用法)你的“文件名”与真实文件的名称不匹配。 http://mywiki.wooledge.org/UsingFind